Trabalho Ordenação - Grupo 3 - Selecao e HeapSort

download Trabalho Ordenação - Grupo 3 - Selecao e HeapSort

of 6

Transcript of Trabalho Ordenação - Grupo 3 - Selecao e HeapSort

Trabalho sobre Algortimo de Ordenao Seleo e HeapSortAlunos Francisco Vicente Severino, Marcos Rogerio Morais da Silva Ronaldo Barbosa Maia

Para que a descrio do algoritmo fique mais simples, convm que os ndices do vetor sejam 1..n e no 0..n-1, como usual em C. Resumindo, nosso algoritmo

SeleoSelectionSort algoritmo de ordenao muito popular, Ele seleciona o menor elemento do vetor, depois o segundo menor, e assim por diante Para entender como e por que o algoritmo funciona basta observar que no incio de cada repetio do for externo, imediatamente antes da comparao de j com n, valem as seguintes invariantes: v[1..i] est em ordem crescente e v[i] v[i+1..n]. A traduo da segunda invariante para linguagem humana a seguinte: v[1..i] contm todos os elementos "pequenos" do vetor original e v[i+1..n] contm todos os elementos "grandes". As duas invariantes garantem que no incio de cada iterao v[1], . . , v[i] j esto em suas posies definitivas.i 1 2 3 4 1 2 3 4 pequenos, crescente 5 5 6 6 7 7 8 8 i+1 9 10 14 32 grandes n 11 54 12 75 13 23 14 65 15 9

HeapSortHeapSort um algortimo de ornenao sofisticado, inventado por J.W.J. Williams baseado em uma estrutura de dados conhecida como heap monte, (rvore binria quase completa). N rvore binria o indice 1 a raiz da rvore. O pai de um elemento f a divio inteira de f/2 e o indice 1 no tem pai O filho esquerdo de p (pai) 2*p e o filho direito 2*p+1, O filho esquerdo s existe se 2*p valor[i]); printf("\n"); }; void InsereLista( Tlista *lista, Titem *item){ lista->tam++; lista->valor[lista->tam].num = item->num; }; // Esta funo rearranja o vetor v[1..n] em // ordem crescente. void selecao (Tlista *lista) { int i, j, min, x, n= lista->tam; for (i = 1; i valor[min].matricula) min = j; x = lista->valor[i].matricula; lista->valor[i].matricula = lista>valor[min].matricula; lista->valor[min].matricula = x; } } // Recebe p em 1..m e rearranja o vetor // v[1..m] de modo que o "subvetor" cuja // raiz p seja um max-heap. // Supe que os "subvetores" cujas razes // so filhos de p j so max-heaps. void peneira (int p, int m, Tlista *lista){ int f = 2*p, x; while (f valor[f].num < lista->valor[f+1].num) ++f; // f o filho "mais valioso" de p if (lista->valor[f/2].num >= lista->valor[f].num) break; x = lista->valor[f/2].num, lista->valor[f/2].num = lista->valor[f].num, lista->valor[f].num = x; f *= 2; } }; // Rearranja os elementos do vetor v[1..n] // de modo que fiquem em ordem crescente void heapsort (Tlista *lista){ int n, p, m, x; n = lista->tam; for (p = n/2; p >= 1; --p) peneira (p, n, lista); for (m = n; m >= 2; --m) { x = lista->valor[1].num, lista->valor[1].num = lista->valor[m].num, lista>valor[m].num = x; peneira (1, m-1, lista); } }