algoritmos e estruturas de ados ces-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3...
TRANSCRIPT
![Page 1: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/1.jpg)
ALGORITMOS EALGORITMOS EESTRUTURAS DE DADOSCES-11Prof. Paulo André [email protected] 110 – Prédio da Computaçãowww.comp.ita.br/~pauloacIECE - ITA
![Page 2: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/2.jpg)
MÉTODOS MAIS EFICIENTES QUE O(N2)
� Método Quicksort
� Método Heap-Sort
Método MergeSoft� Método MergeSoft
2
![Page 3: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/3.jpg)
O MÉTODO QUICK-SORT
Generalidades e fundamentos
� Quick-Sort é provavelmente o algoritmo de ordenação mais usado por programadores em geral. Foi criado por C.Hoare em 1960.
� Durante muito tempo, pesquisadores de métodos de ordenação se dedicaram mais a aperfeiçoar o Quick-Sortdo que a procurar novos métodos.
3
![Page 4: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/4.jpg)
� No caso médio, Quick-Sort é O(n log2n) e no pior caso é O(n2).
� Quick-Sort é recursivo, mas pode ser transformado em não recursivo, mediante o uso de pilha.
� Quick-Sort aplica a técnica denominada divisão e conquista, que reparte o vetor a ser ordenado em dois sub-vetores e os ordena independentemente.vetores e os ordena independentemente.
4
![Page 5: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/5.jpg)
O método consiste em:
1. Escolher, mediante um critério razoável, um pivô entre todos os elementos do vetor a ser ordenado
Bom é quando tal pivô é a mediana de todos os elementos,
ou seja, quando ele consegue dividir o vetor ao meio
Exemplo: seja o vetor
5
5 5 1 4 1 3 9 2 3 8V
3 6
Seja o maior entre os dois elementos distintos
mais à esquerda escolhido como pivô (pivô = 5)
![Page 6: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/6.jpg)
2. Dividir o vetor em 2 partes: sub-vetor baixo esub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes
5 5 1 4 1 3 9 2 3 8V
3 6
left right
6
pivô = 5
Incondicionalmente, trocar V[left] com V[right]
(para facilitar a elaboração do algoritmo)
![Page 7: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/7.jpg)
2. Dividir o vetor em 2 partes: sub-vetor baixo esub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes
6 5 1 4 1 3 9 2 3 8V
3 5
left right
7
pivô = 5
Mover left para a direita até V[left] ≥≥≥≥ pivô
Mover right para a esquerda até V[right] < pivô
![Page 8: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/8.jpg)
2. Dividir o vetor em 2 partes: sub-vetor baixo esub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes
6 5 1 4 1 3 9 2 3 8V
3 5
left right
8
pivô = 5
Trocar V[left] com V[right]
![Page 9: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/9.jpg)
2. Dividir o vetor em 2 partes: sub-vetor baixo esub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes
3 5 1 4 1 3 9 2 3 8V
6 5
left right
9
pivô = 5
Mover left para a direita até V[left] ≥≥≥≥ pivô
Mover right para a esquerda até V[right] < pivô
![Page 10: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/10.jpg)
2. Dividir o vetor em 2 partes: sub-vetor baixo esub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes
3 5 1 4 1 3 9 2 3 8V
6 5
left right
10
pivô = 5
Trocar V[left] com V[right]
![Page 11: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/11.jpg)
2. Dividir o vetor em 2 partes: sub-vetor baixo esub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes
3 3 1 4 1 3 9 2 5 8V
6 5
left right
11
pivô = 5
Mover left para a direita até V[left] ≥≥≥≥ pivô
Mover right para a esquerda até V[right] < pivô
![Page 12: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/12.jpg)
2. Dividir o vetor em 2 partes: sub-vetor baixo esub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes
3 3 1 4 1 3 9 2 5 8V
6 5
left right
12
pivô = 5
Trocar V[left] com V[right]
![Page 13: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/13.jpg)
2. Dividir o vetor em 2 partes: sub-vetor baixo esub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes
3 3 1 4 1 3 2 9 5 8V
6 5
left right
13
pivô = 5
Mover left para a direita até V[left] ≥≥≥≥ pivô
Mover right para a esquerda até V[right] < pivô
![Page 14: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/14.jpg)
2. Dividir o vetor em 2 partes: sub-vetor baixo esub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes
3 3 1 4 1 3 2 9 5 8V
6 5
leftright
14
pivô = 5
A divisão está completa pois left > right
![Page 15: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/15.jpg)
2. Dividir o vetor em 2 partes: sub-vetor baixo esub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes
3 3 1 4 1 3 2 9 5 8V
6 5
15
pivô = 5
sub-vetor
baixosub-vetor
alto
Pior caso: um dos sub-vetores com um
só elemento e o outro com mais de um
![Page 16: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/16.jpg)
Aplicar recursivamente os passos anteriores nos 2 sub-vetores formados
Encerrar a recursividade
quando, num dado sub-
vetor, todos os seus
elementos forem iguais
Outros critérios para a
16
Outros critérios para a
escolha do pivô:
•Um dos elementos
extremos do vetor
•Média de três
elementos aleatórios
![Page 17: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/17.jpg)
5.4.2 – Programação
void QuickSort
(int i,int j,vetor V) {
int pivot, pivind, k;
pivind = Pivo(i, j, V);
if (pivind != -1) {
pivot = V[pivind];
k = Particao (i, j, pivot, V);
QuickSort atua entre os índices
i e j do vetor V
Pivo retorna o índice do pivô no
intervalo [i, j] do vetor V;
retorna -1, caso o intervalo não
tenha pivô (sem elementos
distintos)
Particao divide o intervalo [i, j]
do vetor V nos sub-vetores baixo k = Particao (i, j, pivot, V);
QuickSort (i, k-1, V);
QuickSort (k, j, V);
}
}
17
do vetor V nos sub-vetores baixo
e alto, retornando o índice do 1º
elemento no sub-vetor alto
3 3 1 4 1 3 2 9 5 8V
6 5
sub-vetor
baixo
sub-vetor
altoi jk
![Page 18: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/18.jpg)
Função Pivô: retorna -1, se o vetor no trecho considerado não possui elementos distintos; caso contrário retorna o índice do maior entre os dois elementos distintos mais à esquerda.
int Pivo (int i,int j, vetor V) {
int prim, k, indpiv; int achou;
prim = V[i]; achou = FALSE;
k = i+1; indpiv = -1;
while (! achou && k <= j)while (! achou && k <= j)
if (V[k] == prim) k++;
else {
achou = TRUE;
if (V[k] > prim) indpiv = k;
else indpiv = i;
}
return indpiv;
}
18
![Page 19: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/19.jpg)
Função Partição: faz a permutação dos elementos do vetor e acha o ponto de partição nos dois subvetores:
int Particao (int i, int j,int piv; vetor V) {
int left, right, aux;
left = i; right = j;
do {
aux = V[left]; V[left] = V[right];aux = V[left]; V[left] = V[right];
V[right] = aux;
while (V[left] < piv) left++;
while (V[right] >= piv) right--;
} while (left <= right);
return left;
}19
![Page 20: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/20.jpg)
O MÉTODO HEAP-SORT
Definição de heap
� Árvore binária completa: tem todos os nós possíveis em cada nível; exemplos:
20
![Page 21: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/21.jpg)
Heap: árvore binária completa ou a árvore binária:
� Que é completa pelos menos até o seu penúltimo nível e
� Na qual as folhas do último nível estão o mais à esquerdapossível.
Exemplos:
21
![Page 22: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/22.jpg)
� A estrutura de um heap é única para um número fixo de nós
� Exemplo: o heap abaixo com 18 nós é único
22
![Page 23: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/23.jpg)
� Estrutura de dados para heap’s: vetor de n inteiros
� Declarações:
typedef int vetor[200];
struct heap {vet elem; int n;};
heap H1, H2;
� Observação: os nós são os índices do vetor; exemplo a seguir
23
![Page 24: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/24.jpg)
Propriedades dessa representação:
nó i: iésima posição do vetor
24
nó i: iésima posição do vetor
nó i tem como filhos 2i + 1
2i + 2
pai: (i-1) / 2
altura de um heap de n nós: log2n
![Page 25: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/25.jpg)
5.5.2 – Fila de prioridades
a) Definição: é um heap em que o valor de um nó é sempre menor ou igual aos de seus eventuais filhos
Exemplos:
25
![Page 26: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/26.jpg)
b) Operação de deletar o elemento mínimo duma fila de prioridades:
Inicialmente:
3
5 9
26
6 98 10
10 18 9
![Page 27: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/27.jpg)
Retira-se a raiz e coloca-se ali o último elemento
5 9
27
6 98 10
10 18 9
![Page 28: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/28.jpg)
5 9
9
trocar
28
6 98 10
10 18
![Page 29: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/29.jpg)
9 9
5trocar
29
6 98 10
10 18
![Page 30: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/30.jpg)
6 9
5
fim da
operação
30
9 98 10
10 18
![Page 31: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/31.jpg)
c) Operação de inserir um elemento numa fila de prioridades:
Seja a inserção do 1:
3
5 9
31
6 98 10
10 18 9
![Page 32: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/32.jpg)
Coloca-se o elemento a ser inserido na última posição
3
5 9
trocar
32
6 98 10
10 18 9 1
trocar
![Page 33: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/33.jpg)
3
5 9trocar
33
6 91 10
10 18 9 8
![Page 34: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/34.jpg)
3
1 9
trocar
34
6 95 10
10 18 9 8
![Page 35: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/35.jpg)
1
3 9
fim da
operação
35
6 95 10
10 18 9 8
![Page 36: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/36.jpg)
5.5.3 – Programação do Heap-Sort
� O método consiste em duas partes principais:
1. Inserir elemento por elemento do vetor numa fila de prioridades
2. Retirar pela raiz todos os elementos da fila de prioridades, retornando-os ao vetor
36
![Page 37: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/37.jpg)
void HeapSort (int n, vetor V) {
int i; heap H;
iniciar(&H);
for (i = 0; i < n; i++)
Inserir (V[i], &H);
for (i = 0; i < n; i++)
V[i] = DeletaMin (&H);V[i] = DeletaMin (&H);
}
void iniciar (heap *H) {
H->n = 0;
}
37
![Page 38: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/38.jpg)
void Inserir (int x; heap *H) {
int i, temp;
if (H->n >= 200)
printf("Insercao em heap cheio");
else {
(H->n)++; i = H->n - 1; H->elem[i] = x;
while (i > 0 && H->elem[i] <
H->elem[(i-1)/2]) {H->elem[(i-1)/2]) {
temp = H->elem[i];
H->elem[i] = H->elem[(i-1)/2];
H->elem[(i-1)/2] = temp; i = (i-1)/2;
}
}
} 38
![Page 39: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/39.jpg)
int DeletaMin (heap *H) {
int i, j, temp, ret; int parou;
if (H->n == 0) {
printf ("Delecao em heap vazio"); return -1;}
else {
ret = H->elem[0]; H->elem[0] = H->elem[H->n - 1];
(H->n)--; parou = FALSE; i = 0;
while (! parou && 2*i+1 <= H->n - 1) {
if (2*i+1 == H->n - 1 ||
H->elem[2*i+1] < H->elem[2*i+2])
j = 2*i+1;j = 2*i+1;
else j = 2*i+2;
if (H->elem[i] > H->elem[j]) {
temp = H->elem[i]; H->elem[i] = H->elem[j];
H->elem[j] = temp; i = j;
}
else parou = TRUE;
}
return ret;
}
}
39
![Page 40: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/40.jpg)
Observações:
�O método Heap-Sort é O(n log n) no caso médio e no pior caso
− Altura de um heap de n nós: log2n
�No caso médio, Quick-Sort leva alguma vantagemsobre Heap-Sortsobre Heap-Sort
�Há um gasto maior de memória devido à variável H
40
![Page 41: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/41.jpg)
O MÉTODO MERGE-SORT
� Merge: fundir num só dois vetores ordenados, mantendo a ordem.
� Mas, se inicialmente o vetor está desordenado, como fazer fusão?
41
![Page 42: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/42.jpg)
Idéia recursiva: Caso o vetor tenha dois ou mais elementos:
� Dividir o vetor ao meio, obtendo a metade da esquerda e a metade da direita;
� Ordenar cada uma dessas metades pelo Merge-Sort;
� Fundir as duas metades ordenadas.
42
![Page 43: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/43.jpg)
� Fundir dois vetores ordenados: percorrê-los com cursores, comparando os elementos da posição dos mesmos; o menor é copiado num vetor temporário.
� Exemplo: Fusão dos seguintes vetores:
V1: 3, 5, 8, 8, 11, 13, 16 e V2: 4, 5, 6, 7, 8, 9
43
![Page 44: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/44.jpg)
�No método Merge-Sort, os dois vetores são sub-�No método Merge-Sort, os dois vetores são sub-vetores do vetor a ser ordenado
44
V1 V2
V 3 5 8 8 11 13 16 4 5 6 7 8 9
![Page 45: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/45.jpg)
void MergeSort (int first,int last, vetor V) {
int med;
if (first < last) {
med = (first + last)/2;
MergeSort (first, med, V);
MergeSort (med+1, last, V);
Merge (first, last, V);Merge (first, last, V);
}
}
�A seguir, ilustração do método Merge-Sort para o vetor:
8, 6, 4, 6, 5, 7, 1, 2, 9, 7, 2 45
![Page 46: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/46.jpg)
46
![Page 47: ALGORITMOS E ESTRUTURAS DE ADOS CES-11pauloac/ces11/ordenacao2_slides.pdf · 2010-10-18 · 5.5.3 – Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir](https://reader033.vdocuments.com.br/reader033/viewer/2022043010/5fa07c267ba22957002e2cbd/html5/thumbnails/47.jpg)
void Merge (int first, last; vetor V) {
int med, i, j, k; vetor T;
med = (first + last)/2;
i = 0; j = first; k = med + 1;
while (j <= med && k <= last) {
if (V[j] < V[k]) {T[i] = V[j]; j++;}
else {T[i] = V[k]; k++;}
i++;i++;
}
while (j <= med) {T[i] = V[j]; j++; i++;}
while (k <= last) {T[i] = V[k]; k++; i++;}
for (j = first, i = 0; j <= last; j++, i++)
V[j] = T[i];
} 47
Merge é O(n) e MergeSort é O(n log n)