métodos de ordenação eficiente · 2019-11-29 · cabe ressaltar que há outros métodos de...

50
Programação De Computadores II Métodos de Ordenação Eficiente Slides adaptados do Profº Paulo Afonso - UFLA Profª Valéria Profº Jadson

Upload: others

Post on 09-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

Programação De Computadores II

Métodos de Ordenação Eficiente

Slides adaptados do Profº Paulo Afonso - UFLA

Profª ValériaProfº Jadson

Page 2: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

2

◻Algoritmos Insertion sort e Selection sort⬜Em geral são pouco eficientes

◻Utilizar algoritmos que utilizam a estratégia de divisão e conquista⬜Quick Sort

⬜Merge Sort

Introdução

Page 3: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

3

◻É o algoritmo de ordenação interna mais rápido que se conhece para uma ampla variedade de situações.

◻A ideia básica é dividir o problema de ordenar um conjunto com N itens em problemas menores sucessivas vezes.

Quick Sort

Page 4: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

4

◻ A parte mais delicada do método é relativa à partição do vetor.

◻ O vetor v[esq...dir] é particionado, por meio da escolha arbitrária de um pivô x, em:

⬜Uma parte esquerda com chaves menores ou iguais a x: os itens v[esq], v[esq + 1], ..., v[j].

⬜Uma parte direita com chaves maiores ou iguais a x: os itens v[i], v[i + 1], ..., v[dir].

Quick Sort

Page 5: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

5

◻ Funcionamento do particionamento:1. Escolha arbitrariamente um pivô x.

2. Percorra o vetor a partir da esquerda até que v[i] ≥x.

3. Percorra o vetor a partir da direita até que v[j] x≤ .

4. Troque v[i] com v[j].

5. Incremente o valor de i e decremente o valor de j.

6. Continue este processo (passos 2 A 5) até os índices i e j se cruzarem.

Quick Sort

Page 6: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

6

◻ Ilustração do processo de partição:

◻ Passo 1: escolha arbitrariamente um pivô x.⬜O pivô é dado por v[(i + j)/2], onde i = índice inicial e j

= índice final do vetor.⬜Se a divisão (i + j)/2 não for um número inteiro,

considera-se o piso. ⬜Como inicialmente, i = 0 e j = 5, então x = v[2] = D.

0 1 2 3 4 5O R D E N A

Quick Sort

Page 7: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

7

◻ Passo 2: percorra o vetor a partir da esquerda até que v[i] x≥ .

◻ Passo 3: percorra o vetor a partir da direita até que v[j] x≤ .

0 1 2 3 4 5O R D E N Ai j

0 1 2 3 4 5O R D E N Ai j

Quick Sort

Page 8: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

8

◻ Passo 4: troque v[i] com v[j].

◻ Passo 5: incremente o valor de i e decremente o valor de j.

◻ Continue o processo (passos 2 à 5) até que os índices i e j se cruzem.

0 1 2 3 4 5A R D E N Oi j

0 1 2 3 4 5A R D E N O

i j

Quick Sort

Page 9: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

9

◻ Passos 2 e 3: percorra o vetor a partir da esquerda até que v[i] x≥ . Percorra o vetor a partir da direita até que v[j] x≤ .

0 1 2 3 4 5A R D E N O

i j

Quick Sort

0 1 2 3 4 5A R D E N O

i j

Page 10: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

10

◻ Passo 4 e 5: troque v[i] com v[j]. Incremente o valor de i e decremente o valor de j.

Quick Sort

0 1 2 3 4 5A D R E N O

i j

0 1 2 3 4 5A D R E N O

j i

Page 11: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

11

◻ Como os índices i e j se cruzaram, o algoritmo de partição termina.

◻ Observe que:◻ os elementos de v[0] até v[j] são menores ou iguais

ao pivô; e◻ os elementos de v[i] até v[5] são maiores ou iguais ao

pivô.

0 1 2 3 4 5A D R E N O

j i

Quick Sort

Page 12: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

12

◻ Após obter as duas “partes” do vetor por meio do particionamento, o processo é repetido para cada parte, recursivamente.

0 1 2 3 4 5A D R E N Oi j i j

0 1 2 3 4 5A D R E N O

j i

Quick Sort

Page 13: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

13

0 1 2 3 4 5A D R E N Oi j i j

0 1 2 3 4 5A D R E N O

j i i j2 3 4 5R E N Oi j2 3 4 5R E N Oi j2 3 4 5E R N Oj i

Partição

Partição

Quick Sort

Page 14: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

14

0 1 2 3 4 5A D E R N O

j i j i3 4 5R N Oi j

Partição

3 4 5R N Oi j3 4 5N R Oj i

Não precisa particionar, pois só resta um elemento

em cada subvetor

Quick Sort

Page 15: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

15

3 4 5N R Oj i

4 5R Oi j

Não precisa particionar, pois só resta um elemento

em cada subvetor

4 5O Rj i

Partição

Quick Sort

Não precisa particionar, pois só resta um elemento

em cada subvetor

Page 16: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

16

◻ Juntando as partes, o vetor ficou assim:

◻ Então, a ideia da ordenação é:⬜Dividir o vetor maior em dois vetores menores, um

vai de esq até j e o outro de i até dir.⬜Se os vetores menores possuírem, pelo menos, dois

elementos, chama-se algoritmo de partição recursivamente e o processo se repete até que todo vetor maior esteja ordenado.

4 5O R

3N

2E

0 1A D

Quick Sort

Page 17: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

17

void particiona(int v[], int esq, int dir) { int i = esq; int j = dir; int pivo = v[((i + j) / 2)]; do {

while (v[i] < pivo)i++;

while (v[j] > pivo)j--;

if (i <= j) {int aux = v[i];v[i] = v[j];v[j] = aux;i++; j--;

} } while (i <= j);

if (esq < j) particiona(v, esq, j); if (i < dir) particiona(v, i, dir);

}

void particiona(int v[], int esq, int dir) { int i = esq; int j = dir; int pivo = v[((i + j) / 2)]; do {

while (v[i] < pivo)i++;

while (v[j] > pivo)j--;

if (i <= j) {int aux = v[i];v[i] = v[j];v[j] = aux;i++; j--;

} } while (i <= j);

if (esq < j) particiona(v, esq, j); if (i < dir) particiona(v, i, dir);

}

Quick Sort

Page 18: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

18

◻ Para invocar o Quick Sort a partir da função main, faz-se:

void quickSort(int v[], int n) {particiona(v, 0, n - 1);

}

int main() {int TAM = 10;int v[] = {5, 3, 2, 2, 1, 6, 5, 7, 9, 10};quickSort(v, TAM);return EXIT_SUCCESS;

}

void quickSort(int v[], int n) {particiona(v, 0, n - 1);

}

int main() {int TAM = 10;int v[] = {5, 3, 2, 2, 1, 6, 5, 7, 9, 10};quickSort(v, TAM);return EXIT_SUCCESS;

}

Quick Sort

Page 19: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

19

◻Vantagens:

⬜É extremamente eficiente para ordenar grandes arquivos de dados.

⬜Necessita apenas de uma pequena pilha como memória auxiliar.

⬜Requer cerca de nlgn comparações em média para ordenar n itens.

Quick Sort

Page 20: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

20

◻Desvantagens:

⬜Tem um pior caso de n2 comparações.

⬜Sua implementação é delicada e difícil se comparada a dos métodos simples.

Quick Sort

Page 21: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

21

◻Outro algoritmo eficiente para ordenação é o Merge Sort, desenvolvido por John von Neumann.

◻É considerado um dos primeiros métodos de ordenação inventados.

Merge Sort

Page 22: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

22

◻A propriedade mais atrativa deste método de ordenação é que ele é capaz de ordenar um vetor qualquer de n de elementos em um tempo proporcional a nlgn.

◻ Isto é, não importa a maneira como os elementos estão organizados no vetor, sua complexidade será sempre a mesma.

Merge Sort

Page 23: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

23

◻Uma das desvantagens deste método, entretanto, é que ele requer espaço extra de memória proporcional a n.

◻Assim, Merge Sort é ideal para aplicações que precisam de ordenação eficiente, que não toleram desempenho ruim no pior caso e que possuam espaço de memória extra disponível.

Merge Sort

Page 24: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

24

◻O processo-chave do Merge Sort consiste em dividir o vetor original em subvetores cada vez menores até que se tenha pequenos subvetores com um elemento apenas.

◻A partir daí, cada par de subvetores é fundido (merged) de forma intercalada até se obter um único vetor ordenado com todos os elementos.

Merge Sort

Page 25: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

25

Merge Sort

Page 26: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

26

Merge Sort

Page 27: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

27

Merge Sort

Page 28: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

28

Merge Sort

Page 29: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

29

Merge Sort

Page 30: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

30

Merge Sort

Page 31: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

31

Merge Sort

Page 32: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

32

Merge Sort

Page 33: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

33

Merge Sort

Page 34: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

34

Merge Sort

Page 35: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

35

Merge Sort

Page 36: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

36

Merge Sort

Page 37: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

37

Merge Sort

Page 38: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

38

Merge Sort

Page 39: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

39

Merge Sort

Page 40: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

40

Merge Sort

Page 41: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

41

Merge Sort

Page 42: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

42

Merge Sort

Page 43: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

43

Merge Sort

Page 44: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

44

int *aux; // Variável globalvoid mergeSort(int v[], int n) { aux = new int[n]; mergesort(v, 0, n - 1); delete[] aux;}

int main() { int TAM = 10; int v[] = {5, 3, 2, 2, 1, 6, 5, 7, 9, 10}; mergeSort(v, TAM); return EXIT_SUCCESS;}

int *aux; // Variável globalvoid mergeSort(int v[], int n) { aux = new int[n]; mergesort(v, 0, n - 1); delete[] aux;}

int main() { int TAM = 10; int v[] = {5, 3, 2, 2, 1, 6, 5, 7, 9, 10}; mergeSort(v, TAM); return EXIT_SUCCESS;}

Merge Sort

Page 45: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

45

void mergesort(int v[], int esq, int dir) {if (esq < dir) {

int meio = (esq + dir) / 2;mergesort(v, esq, meio);mergesort(v, meio + 1, dir);intercala(v, esq, meio, dir);

}}

void mergesort(int v[], int esq, int dir) {if (esq < dir) {

int meio = (esq + dir) / 2;mergesort(v, esq, meio);mergesort(v, meio + 1, dir);intercala(v, esq, meio, dir);

}}

Merge Sort

Page 46: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

46void intercala(int v[], int esq, int meio, int dir) { int i, j; i=meio+1;

while(i>esq){ aux[i - 1] = v[i - 1]; i--;

}j=meio;while(j<dir){

aux[dir + meio - j] = v[j + 1]; j++;

} for(int k = esq; k <= dir; k++) { if (aux[j] < aux[i]) { v[k] = aux[j]; j--; } else { v[k] = aux[i]; i++; } }}

void intercala(int v[], int esq, int meio, int dir) { int i, j; i=meio+1;

while(i>esq){ aux[i - 1] = v[i - 1]; i--;

}j=meio;while(j<dir){

aux[dir + meio - j] = v[j + 1]; j++;

} for(int k = esq; k <= dir; k++) { if (aux[j] < aux[i]) { v[k] = aux[j]; j--; } else { v[k] = aux[i]; i++; } }}

Merge Sort

Page 47: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

47

◻ O número de comparações a serem realizadas pelo método de ordenação Merge Sort não depende de como os elementos estão organizados no vetor.

◻ Assim, para o pior caso, melhor caso e caso médio, a complexidade do Merge Sort é proporcional a nlgn.

Merge Sort

Page 48: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

48

◻As vantagens do Merge Sort são que ele é um método eficiente e não sensível à ordem em que os elementos aparecem no vetor.

◻A principal desvantagem deste método é que ele requer uma quantidade de espaço extra proporcional ao tamanho do vetor.

Merge Sort

Page 49: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

49

◻É responsabilidade do desenvolvedor saber decidir qual método de ordenação melhor atende às suas necessidades.

◻Para isso, ele precisa conhecer bem os detalhes do seu problema, bem com as características dos principais métodos de ordenação.

Considerações Finais

Page 50: Métodos de Ordenação Eficiente · 2019-11-29 · Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina. Por exemplo, o método

50

◻Cabe ressaltar que há outros métodos de ordenação interessantes que não foram abordados nesta disciplina.

◻Por exemplo, o método de ordenação Heap Sort executa nlgn comparações no pior caso e também não é sensível à ordem inicial dos elementos do vetor de entrada.

Considerações Finais