41
IF672 - Algoritmos e Estruturas de Dados CIn - UFPE [email protected]

Ordenação

  • Upload
    dillon

  • View
    40

  • Download
    0

Embed Size (px)

DESCRIPTION

Ordenação. IF672 - Algoritmos e Estruturas de Dados CIn - UFPE. [email protected]. Ordenação. Ordenar é dispor os elementos em ordem ascendente ou descendente. Dados n números, arranjá-los em ordem crescente. Sortings: Heapsort Quicksort Mergesort. Heapsort. - PowerPoint PPT Presentation

Citation preview

Page 1: Ordenação

IF672 - Algoritmos e Estruturas de Dados CIn - UFPE

[email protected]

Page 2: Ordenação

OrdenaçãoOrdenar é dispor os elementos em ordem ascendente

ou descendente.

Dados n números, arranjá-los em ordem crescente.

Sortings:

• Heapsort

• Quicksort

• Mergesort

Page 3: Ordenação

HeapsortOrdenação de um conjunto de elementos com um

heap.

Primeiro passo: construção do heap.

Selecionamos e posicionamos o maior elemento do conjunto, trocando o primeiro com o último elemento.

Decrementamos o tamanho do heap.

Rearranjamos o heap.

Continua com as sucessivas trocas do primeiro com o último elemento e rearranjos do heap.

Page 4: Ordenação

HeapsortApós tudo isso, o array é visto como contendo um heap mais a

parte da solução.

Então, o uso da estrutura heap permite que:

• O elemento máximo do conjunto seja determinado e corretamente posicionado no vetor em tempo constante, trocando o primeiro elemento do heap com o último.

• Número de trocas de elementos proporcional à altura da árvore.

Page 5: Ordenação

Heapsort

34

21

41

22

74

26 9

74 2241 21 934 26

22921

34

41

26

74

74 22 41 21 9 34 26

41 2234 21 926 74

Page 6: Ordenação

921

26

7441

22

34

41 26 34 21 9 22 74

921

26

7422

34

41

41 26 34 21 9 22 74 412634 21 922 74

Heapsort

Page 7: Ordenação

349

21

7441

22

26

34 26 22 21 9 41 74

921

26

7441

22

34

34 26 22 21 9 41 74 412126 9 3422 74

Heapsort

Page 8: Ordenação

3426

21

7441

9

22

26 21 22 9 34 41 74

349

21

7441

22

26

26 21 22 9 34 41 74 412122 26 349 74

Heapsort

Page 9: Ordenação

3426

9

7441

22

21

22 21 9 26 34 41 74

3426

21

7441

9

22

22 21 9 26 34 41 74 41921 26 3422 74

Heapsort

Page 10: Ordenação

3426

21

7441

22

9

21 9 22 26 34 41 74

3426

9

7441

22

21

21 9 22 26 34 41 74 41219 26 3422 74

Heapsort

Page 11: Ordenação

HeapsortChamada:Implementação:

heapsort(array, array.length);

void heapsort (int array[], int n) {

constroiHeap (array, n);

int tamanhoDoHeap = n;

for(int i = n-1; i>0; i--) {

troca (array[0], array[i]);

--tamanhoDoHeap;

heapfy (array,tamanhoDoHeap,0);

}

}

Page 12: Ordenação

QuicksortOrdenação simples de implementar em linguagens

com recursão.

Método “dividir para conquistar”.

Particiona o arquivo em duas partes, ordenando as partes independentes.

Page 13: Ordenação

QuicksortDividir para Conquistar

Dividir: Particione o array em dois subarrays ao

redor de um pivô x de forma que elementos no subarray inferior ≤x≤ elmentos no subarray superior.

Obs: a posição do elementos iguais à chave deve ser especificada, dependendo do objetivo da implementação.

Page 14: Ordenação

QuicksortEscolha um elemento (pivô) e coloque-o no início da

lista.

Varra o array a partir da esquerda até encontrar um elemento que seja maior que o pivô e pela direita até encontrar um elemento menor que o pivô.

Os dois devem ser trocados de lugar.

Quando os ponteiros se cruzam, troque o pivô com o elemento mais a esquerda do array.

Page 15: Ordenação

Quicksort: Exemplo Particiona

Page 16: Ordenação

Quicksort: Exemplo Particiona

Page 17: Ordenação

Quicksort: Exemplo Particiona

Page 18: Ordenação

Quicksort: Exemplo Particiona

Page 19: Ordenação

Quicksort: Exemplo Particiona

Page 20: Ordenação

Quicksort: Exemplo Particiona

Page 21: Ordenação

QuicksortFunção Particiona

Implementação:int particiona (int array[], int i, int f) {

int a = i+1; int b = f; int pivo = array[i];

while(a <= b) {

while(a<=f && array[a]<pivo) a++;

while(array[b]>pivo) b--;

if(a < b) troca (array[a], array[b]);

}

troca(array[b], array[i]); return b;

}

Page 22: Ordenação

QuicksortChamada:

Implementação:

void quicksort (int array[], int i, int f) { if (i < f) {

int p = particiona (array, i, f);

quicksort (array, i, p-1);

quicksort (array, p+1, f);

}

}

quicksort(array, 0, array.length-1);

Page 23: Ordenação

QuicksortConsiderações finais

• Quicksort é um ótimo algoritmo de ordenação de propósito geral.

• Quicksort é normalmente mais rápido que o Mergesort, mas no pior caso tem custo O(n²).

Page 24: Ordenação

MergesortAlgoritmo particular de ordenação.

Método “dividir para conquistar”.

Divide o array no meio.

Ordena cada metade com Mergesort novamente.

Junta (merge) as partes já ordenadas.

Problema: necessita de um espaço igual ao dobro do tamanho da lista a ser ordenada.

Page 25: Ordenação

Mergesort

82 3670 72 2511 44 10

82 3670 72 2511 44 10

82 70 36257211 44 10

82 70 7211 3625 44 10

Page 26: Ordenação

Mergesort

10 7011 36 4425 72 82

82 3670 72 2511 44 10

70 82 36257211 10 44

11 70 8272 2510 36 44

Page 27: Ordenação

MergesortChamada:

Implementação:

void mergesort(int array[], int i, int f) {

if (i < f) {

int mid = (i+f)/2;

mergesort (array, i, mid);

mergesort (array, mid+1, f);

intercala (array, i, mid, f);

}

mergesort(array, 0, array.length-1);

Page 28: Ordenação

MergesortFunção Merge/Intercala

11 70 8272 2510 36 44

Divisão da direita Divisão da esquerda

a b

Page 29: Ordenação

MergesortFunção Merge/Intercala

10

11 70 8272 2510 36 44

Divisão da direita Divisão da esquerda

a b

Page 30: Ordenação

MergesortFunção Merge/Intercala

10 11

11 70 8272 2510 36 44

Divisão da direita Divisão da esquerda

a b

Page 31: Ordenação

MergesortFunção Merge/Intercala

10 11 25

11 70 8272 2510 36 44

Divisão da direita Divisão da esquerda

a b

Page 32: Ordenação

MergesortFunção Merge/Intercala

10 11 3625

11 70 8272 2510 36 44

Divisão da direita Divisão da esquerda

a b

Page 33: Ordenação

MergesortFunção Merge/Intercala

10 11 36 4425

11 70 8272 2510 36 44

Divisão da direita Divisão da esquerda

a b

Page 34: Ordenação

MergesortFunção Merge/Intercala

10 7011 36 4425 72 82

11 70 8272 2510 36 44

Divisão da direita Divisão da esquerda

a b

Page 35: Ordenação

MergesortImplementação Merge/Intercalavoid intercala (int array[], int left, int mid, int right) {

int i = left;int j = mid + 1;int k = left - 1;while (i <= mid && j <= right) {

k++;if (array[i] <= array[j]) {

temp[k] = array[i];i++;

} else {temp[k] = array[j];j++;

}}

//...}

Page 36: Ordenação

MergesortImplementação Merge/Intercalavoid intercala (int array[], int left, int mid, int right) {

while (i <= mid) {temp[k] = array[i]; i++; k++;

}

while (j <= right) {temp[k] = array[j]; j++; k++;

}

}

Page 37: Ordenação

Relembrando:Busca BináriaBusca eficiente feita em um array ordenado.

A busca é iniciada pelo elemento central. Se o elemento procurado for menor, procura-se novamente na primeira metade, caso contrário, na segunda.

A

x < A x > A

B

x < B x > B

C

x < C x > C

Page 38: Ordenação

Relembrando:Busca BináriaBusca bem sucedida: número 8

1 2 4 5 8 10 11 20 25 32 33 37 39 46 50

i = 0 f = 14m = 7

1 2 4 5 8 10 11

i = 0 f = 6m = 3

8 10 11

i = 0 f = 6m = 5

8

i = m = f = 5

8 < 20

8 > 5

8 < 10

Page 39: Ordenação

Relembrando:Busca BináriaBusca mal sucedida: número 28

1 2 4 5 8 10 11 20 25 32 33 37 39 46 50

i = 0 f = 14m = 7

25

i = m = f = 8

28 > 20

i = 8 f = 14m = 11

25 32 33 37 39 46 50

i = 8 f = 10m = 9

25 32 33

28 < 37

28 < 32

Page 40: Ordenação

Relembrando:Busca BináriaChamada:

Implementação:

int bs(int array[], int i, int f, int x) { int mid = (i+f)/2;

if (x == array[mid]) // caso base 1 (encontrado) return mid; else if (i >= f) // caso base 2 (não existe) return –1;

else if (x < array[mid]) // caso indutivo return bs(array, i, mid-1, x) else return bs(array, mid+1, f, x)}

bs(array, 0, array.length-1, x);

Page 41: Ordenação

IF672 - Algoritmos e Estruturas de Dados CIn - UFPE

[email protected]