aula 07 - quick sort

20
QuickSort Pesquisa, Ordenação e Técnicas de Armazenamento Segundo Semestre de 2010 Prof. Fernando Aires

Upload: danilo-gomes

Post on 25-Jun-2015

369 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Aula 07 - Quick Sort

QuickSort

Pesquisa, Ordenação e Técnicas de Armazenamento Segundo Semestre de 2010

Prof. Fernando Aires

Page 2: Aula 07 - Quick Sort

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.

Page 3: Aula 07 - Quick Sort

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

Page 4: Aula 07 - Quick Sort

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.

Page 5: Aula 07 - Quick Sort

Particionamento

Pivô

0 1 2 3 4 5 6 7

18 7 42 3 24 8 57 16

1o maior

Page 6: Aula 07 - Quick Sort

Particionamento

Pivô

0 1 2 3 4 5 6 7

18 7 42 3 24 8 57 16

1o maior

Page 7: Aula 07 - Quick Sort

Particionamento

Pivô

0 1 2 3 4 5 6 7

7 18 42 3 24 8 57 16

1o maior

Page 8: Aula 07 - Quick Sort

Particionamento

Pivô

0 1 2 3 4 5 6 7

7 18 42 3 24 8 57 16

1o maior

Page 9: Aula 07 - Quick Sort

Particionamento

Pivô

0 1 2 3 4 5 6 7

7 18 42 3 24 8 57 16

1o maior

Page 10: Aula 07 - Quick Sort

Particionamento

Pivô

0 1 2 3 4 5 6 7

7 3 42 18 24 8 57 16

1o maior

Page 11: Aula 07 - Quick Sort

Particionamento

Pivô

0 1 2 3 4 5 6 7

7 3 42 18 24 8 57 16

1o maior

Page 12: Aula 07 - Quick Sort

Particionamento

Pivô

0 1 2 3 4 5 6 7

7 3 42 18 24 8 57 16

1o maior

Page 13: Aula 07 - Quick Sort

Particionamento

Pivô

0 1 2 3 4 5 6 7

7 3 8 18 24 42 57 16

1o maior

Page 14: Aula 07 - Quick Sort

Particionamento

Pivô

0 1 2 3 4 5 6 7

7 3 8 18 24 42 57 16

1o maior

Page 15: Aula 07 - Quick Sort

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?

Page 16: Aula 07 - Quick Sort

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ô}

Page 17: Aula 07 - Quick Sort

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.

Page 18: Aula 07 - Quick Sort

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); }}

Page 19: Aula 07 - Quick Sort

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.

Page 20: Aula 07 - Quick Sort

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.