Quick Sort
Quick Sort é um algoritmo eficiente de ordenação por divisão e conquista. Apesar de ser da mesma classe de complexidade do Merge Sort e do Heap Sort, o Quick Sort é na prática o mais veloz deles, pois suas constantes são menores. Contudo, é importante destacar de antemão que, em seu pior caso, o Quick Sort é O(n2), enquanto que o Merge Sort e o Heap Sort garantem n∗logn para todos os casos. A boa notícia é que há estratégias simples com as quais podemos minimizar as chances de ocorrência do pior caso.
O funcionamento do Quick Sort baseia-se em uma rotina fundamental cujo nome é particionamento. Particionar significa escolher um número qualquer presente no array, chamado de pivot, e colocá-lo em uma posição tal que todos os elementos à esquerda são menores ou iguais e todos os elementos à direita são maiores.
Como tudo funciona
Mãos a obra:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class QuickSort {
public static void main(String[] args) {
Scanner leia = new Scanner(System.in);
ArrayList lista = new ArrayList<>();
int cont = 1;
for (int i = 0; i < 1000; i++) {
Random rand = new Random();
int n = rand.nextInt(1000);
lista.add(n);
}
lista = quickSort(lista);
for (Integer integer : lista) {
System.out.print(integer + ", ");
if (cont % 20 == 0) {
System.out.println();
}
cont++;
}
}
/* ---------------------- Algoritimo De Ordenação ---------------------- */
private static ArrayList quickSort(ArrayList lista) {
int size = lista.size();
if (lista.size() <= 1) {
return lista;
}
int middle = (int) Math.ceil((double) size / 2);
int pivot = lista.get(middle);
ArrayList less = new ArrayList();
ArrayList greater = new ArrayList();
for (int i = 0; i < size; i++) {
if (lista.get(i) <= pivot) {
if (i == middle) {
continue;
}
less.add(lista.get(i));
} else {
greater.add(lista.get(i));
}
}
return concatenate(quickSort(less), pivot, quickSort(greater));
}
private static ArrayList concatenate(ArrayList less, int pivot, ArrayList greater) {
ArrayList aux = new ArrayList();
for (int i = 0; i < less.size(); i++) {
aux.add(less.get(i));
}
aux.add(pivot);
for (int i = 0; i < greater.size(); i++) {
aux.add(greater.get(i));
}
return aux;
}
}
Tempo de execução(em segundos) VS Qtd de nº no Array:
Quick Sort | 1.000 | 10.000 | 500.000 | 1.000.000 |
---|---|---|---|---|
Bom | 0.0104072 | 0.0069883 | 0.3392144 | 0.6794286 |
Médio | 0.0019946 | 0.0112419 | 0.6202614 | 2.3110557 |
Ruim | 0.0007434 | 0.005765 | 0.330906 | 0.6851811 |
*A tabela representa a quantidade de numros utilizadas e o tempo de execução o processo de ordenação