O algoritmo QuickSort é um método de ordenação muito rápido e eficiente, inventado por Charles Antony Richard Hoare, em 1960. O QuickSort adota a estratégia de divisão e conquista. A estratégia consiste em rearranjar as chaves de modo que as chaves "menores" precedam as chaves "maiores". Em seguida, o QuickSort ordena as duas sublistas de chaves menores e maiores, recursivamente até que a lista completa se encontre ordenada.
- Melhor Caso:
O melhor caso de QuickSort é quando selecionamos o pivô como um elemento médio, nesse caso a recursão ficará como mostra o diagrama abaixo:
No diagrama a altura da árvore é logN e em cada nível estaremos percorrendo todos os elementos com o total de operação de logN * N, pois selecionamos o elemento médio, então a matriz será dividida em ramos de tamanho igual, para que a altura da árvore seja mínima, com isso a complexidade de tempo será O(N*log(N)).
- Médio Caso:
O caso médio de complexidade no QuickSort é baseado nos cálculos da imagem abaixo:
Os cálculos da imagem são baseados na média das outras complexidades(Melhor e Pior Caso).
- Pior Caso:
O pior caso acontecerá quando nossa matriz for classificada e selecionarmos o menor ou o maior elemento indexado como pivô, como mostra o diagrama abaixo:
Como podemos ver no diagrama, estamos selecionando o pivô como elemento de índice de canto, então a altura da árvore será N e no nó superior estará fazendo N operações, então N-1 e assim por diante até 1, com isso a complexidade de tempo será O(N^2).
ALGORITMO | COMPLEXIDADE DO PIOR CASO | COMPLEXIDADE DO CASO MÉDIO | COMPLEXIDADE DO MELHOR CASO |
---|---|---|---|
BubbleSort | O(n^2) | O(n^2) | O(n^2) |
HeapSort | O(n * log(n)) | O(n * log(n)) | O(n * log(n)) |
MergeSort | O(n * log(n)) | O(n * log(n)) | O(n * log(n)) |
QuickSort | O(n^2) | O(n * log(n)) | O(n * log(n)) |
A função trocaValores é responsável por trocar os valores de duas posições do vetor.
A função particionar usa o último elemento como pivô. Em seguida, verifica cada elemento e o troca antes do pivô se seu valor for menor. No final do particionamento, todos os elementos menores que o pivô estão à esquerda dele e todos os elementos maiores que o pivô estão à direita dele. O pivô está em sua posição final classificada e a função retorna esta posição.
A função quickSortRec recebe como parâmetros o array a ser ordenado, o primeiro e o último índice. Primeiro, verificamos os índices e continuamos apenas se ainda houver elementos a serem classificados. Obtemos o índice do pivô classificado e o usamos para chamar recursivamente o método particionar() com os mesmos parâmetros do método quickSortRec(), mas com índices diferentes.
A função quickSort serve apenas para facilitar a chamada do algoritmo de ordenação. Ela recebe apenas o vetor a ser ordenado e seu tamanho. É responsável por fazer a primeira chamada para a função quickSortRec (RECursiva), enviando os argumentos necessários para iniciar o algoritmo.
A função exibirVetor é responsável por percorrer todo o vetor exibindo os valores.
A função main serve como ponto de partida para a execução do programa. Ela possui a chamada da função quickSort com seus parâmetros necessários.