Quick Sort
Considerando um dos algoritmos de ordenação eficientes, o Quick Sort é um algoritmo recursivo, que implementa o princípio dividir para conquistar. Embora seja mais eficiente em termos de custo computacional, o processo de compreensão desse algoritmo é um pouco mais complexo do que os anteriores.
Assim, recomendo que vocês leiam atentamente essa explicação, assim como tentem resolver o algoritmo linha a linha no papel, simulando o processo que apresentarei logo mais. Ao final, também há vídeos que explicam a ideia do algoritmo.
Apesar disso, nada é mais eficiente que a execução linha a linha no papel, para que você execute e compreenda o objetivo de cada linha apresentada no algoritmo.
Vamos lá!
🤯 Entendendo a ideia
A ideia é que um vetor seja dividido sucessivas vezes, até que reste apenas um elemento. A ordenação acontece durante esse processo.
Vamos entender o processo inicial:
🔁 A parte recursiva
- Ao chamarmos o algoritmo de ordenação
QuickSort, informamos os seguintes parâmetros:- Qual é o vetor a ser ordenado;
- Qual é a posição inicial do vetor;
- Qual é a última posição válida do vetor;
- Ao iniciar, o algoritmo verificará se o
iníciodo vetor é menor que ofim. Seiniciofor igual ou superior aofim, nada será executado. - O algoritmo baseia-se na ideia de dividir para conquistar. Assim, ele precisa efetuar a partição do vetor em dois. Reforçando: a partição do vetor é uma abstração, ele não será fisicamente divido em dois.
- A função de
particaoretornará um índice do vetor que indica a posição do meio. - Em seguida, o algoritmo
QuickSortfará duas chamadas recursivas (para si mesmo), passando metade do vetor em cada uma delas.
✂️ A partição do vetor
Agora, vamos entender como funciona a função de partição:
A função particao recebe o vetor a ser ordenado, além de duas variáveis de controle: inicio e fim. Já na sua primeira linha, é definido um elemento, chamado pivô, que será utilziado para basear a ordenação do algoritmo.
Observe que, logo no início do processo, o vetor é
- A função de partição escolhe um elemento no meio do vetor, chamado
pivô. Observe que o pivô não é a posição do meio, mas sim o valor armazenado naquela posição. - Duas variáveis adicionais,
aeb, serão criadas:
apercorrerá o vetor da esquerda para a direita;bpercorrerá o vetor da direita para a esquerda;
- A inicialização das variáveis é um pouco curiosa:
aserá inicializada comoinicio-1;bserá inicializada comofim+1;
Realizado esse processo, o algoritmo entra em um loop que compara os elementos nas posições a e b com o valor do pivô. O objetivo é posicionar os elementos menores que o pivô à esquerda e os elementos maiores à direita.
Enquanto a posição de a for menor que a de b:
- Incremente
aenquanto o valor do item na posiçãoado vetor for menor que o pivô; - Decremente
benquanto o valor do item na posiçãobdo vetor maior que o pivô; - Se
afor menor queb, troque os elementos dessas posições.
Esse processo continua até que a e b se cruzem, momento em que a partição está finalizada. Ao final da função de partição, o índice de b é retornado. Esse índice será utilizado pela função Quick Sort para identificar o meio do vetor.
👩🏾💻 A implementação
int particao(int vet[], int inicio, int fim){
int pivo = vet[(inicio + fim)/2];
int a = inicio-1;
int b = fim+1;
while(a<b){
do{
a++;
} while(vet[a] < pivo);
do{
b--;
} while(vet[b] > pivo);
if(a<b) trocar(&vet[a], &vet[b]);
}
return b;
}
void quickSort(int vet[], int inicio, int fim){
if(inicio<fim){
int meio = particao(vet,inicio,fim);
quickSort(vet,inicio,meio);
quickSort(vet,meio+1,fim);
}
}
🚀 Execução
Acompanhe, na imagem a seguir, o processo de execução passo-a-passo do algoritmo Quick Sort para a ordenação de um vetor {14,7,2}. Recomendo fortemente que, antes de acompanhar a figura, você observe o fragmento de código acima.
Na figura, tentei mesclar os trechos de código com os seus efeitos num esquema visual.
.
🎬 Vídeos de apoio
Outra opção de material:
⚠️ Dicas importantes
- Ao procurar outros materiais sobre algoritmos de ordenação, atente-se: há outras estratégias para a escolha do pivô no algoritmo QuickSort. A apresentada neste material seleciona o elemento do meio como pivô.