aula 07 - quick sort
TRANSCRIPT
QuickSort
Pesquisa, Ordenação e Técnicas de Armazenamento Segundo Semestre de 2010
Prof. Fernando Aires
Quick SortMais eficiente algoritmo de ordenação, o QuickSort trabalha com o conceito de particionamento.
Ideia geral do particionamento: dado um elemento, chamado pivô, cria-se um vetor tal que todos os menores que o pivô estão à esquerda dele e todos os maiores à direita.
Ideia geral do QuickSort: particione o vetor, e resolva recursivamente cada um dos lados.
ParticionamentoPivô
Menores Maiores
0 1 2 3 4 5 6 7
18 7 42 3 24 8 57 16
0 1 2 3 4 5 6 7
7 3 8 16 24 42 57 18
Particionamento
Algoritmo separado, usado pelo QuickSort.
Percorre o vetor, controlando qual o primeiro (em posições do vetor) elemento maior que o pivô (último elemento).
Sempre que encontra um elemento menor que o pivô, troca ele pelo primeiro maior, e avança o controle.
No final, troca o pivô pelo primeiro maior.
Particionamento
Pivô
0 1 2 3 4 5 6 7
18 7 42 3 24 8 57 16
1o maior
Particionamento
Pivô
0 1 2 3 4 5 6 7
18 7 42 3 24 8 57 16
1o maior
Particionamento
Pivô
0 1 2 3 4 5 6 7
7 18 42 3 24 8 57 16
1o maior
Particionamento
Pivô
0 1 2 3 4 5 6 7
7 18 42 3 24 8 57 16
1o maior
Particionamento
Pivô
0 1 2 3 4 5 6 7
7 18 42 3 24 8 57 16
1o maior
Particionamento
Pivô
0 1 2 3 4 5 6 7
7 3 42 18 24 8 57 16
1o maior
Particionamento
Pivô
0 1 2 3 4 5 6 7
7 3 42 18 24 8 57 16
1o maior
Particionamento
Pivô
0 1 2 3 4 5 6 7
7 3 42 18 24 8 57 16
1o maior
Particionamento
Pivô
0 1 2 3 4 5 6 7
7 3 8 18 24 42 57 16
1o maior
Particionamento
Pivô
0 1 2 3 4 5 6 7
7 3 8 18 24 42 57 16
1o maior
Particionamento
Pivô
0 1 2 3 4 5 6 7
7 3 8 16 24 42 57 18
1o maior
Onde começa o marcador do primeiro maior?
O que a função retorna?
Particionamentopublic static int part(double[] vetor, int ini, int pivo){ int p_maior = ini; for(int i=ini;i<pivo;i++) { if(vetor[i]<vetor[pivo]) { troca(vetor,i,p_maior); p_maior++; } } troca(vetor,p_maior,pivo); return p_maior; //novo pivô}
Quick Sort
Uma vez com o vetor particionado, como resolver o problema?
Chama-se recursivamente o QuickSort para cada um dos lados do particionamento, ordenando-os.
Caso base: início >= fim.
Quick Sort
public static void quicksort(double[] vetor, int ini, int fim){ if(ini<fim) { int pivo=part(vetor,ini,fim); quicksort(vetor,ini,pivo-1); quicksort(vetor,pivo+1,fim); }}
Quick Sort
Algoritmo extremamente eficiente - a maior parte das implementações de ordenação usam o Quick Sort.Não é possível garantir a preservação da ordem relativa, em caso de “empate”.
Quando o vetor já está ordenado, ele é lento como o BubbleSort, mas para o caso médio ele é muito bom.
Exercícios para o lab
Implemente o algoritmo passado em sala de Quick Sort.
Modifique o algoritmo de forma que ele ordene os vetores em ordem decrescente.
Modifique o algoritmo para que ele receba um vetor de objetos, com atributos nome e cpf, e ordene por CPF.