Algoritmo de ordenação heapsort

Embed Size (px)

Text of Algoritmo de ordenação heapsort

  • ALGORITMOS E ESTRUTURAS DE DADOS III Tutorial 8 (usa o compilador de linguagem C Dev-C++ verso 4.9.9.2)

    Parte 2 de 3 sobre o algoritmo de ordenao heap (monte) conhecido como Heapsort.

  • 1 INTRODUO Esta srie de tutoriais sobre Algoritmos e Estrutu-

    ras de Dados III foi escrita usando o Microsoft

    Windows 7 Ultimate, Microsoft Office 2010,

    Bloodshed Dev-C++ verso 4.9.9.2 (pode ser bai-

    xado em http://www.bloodshed.net), referncias

    na internet e notas de aula do professor quando

    estudante. Ela cobre desde os algoritmos de or-

    denao, passando pela pesquisa em memria

    primria e culminando com a pesquisa em me-

    mria secundria.

    Ns entendemos que voc j conhece o compila-

    dor Dev-C++. No caso de voc ainda no o conhe-

    cer, d uma olhada nos tutoriais Dev-C++ 001 a

    017, comeando pelo Tutorial Dev-C++ - 001 -

    Introduo.

    Se no tem problemas com a linguagem C/C++ e

    o compilador Dev-C++, ento o prximo passo

    saber ler, criar e alterar arquivos em disco usan-

    do linguagem C/C++. Se ainda no sabe como

    faz-lo, d uma olhada nos tutoriais Dev-C++ 001

    e 002, comeando pelo Tutorial Dev-C++ 001

    Criao, Leitura e Alterao de Arquivos.

    Se sabe todas as coisas anteriores, ento a pr-

    xima etapa conhecer os algoritmos mais bsicos

    de ordenao. Em minhas notas de aula voc

    encontra um material bsico, porm detalhado e

    com algoritmos resolvidos, dos principais mto-

    dos de ordenao existentes.

    Adotaremos o livro Projeto de Algoritmos com

    Implementao em Pascal e C, Editora Cengage

    Learning, de Nivio Ziviani, como livro-texto da

    disciplina. Nele voc encontrar os mtodos de

    ordenao que iremos estudar.

    Seu prximo passo ser estudar os algoritmos de

    ordenao por Insero, Seleo, Shellsort e

    Quicksort. Voc pode usar os links anteriores

    (em ingls) ou fazer uso do livro-texto.

    Em seguida, voc precisa conhecer o algoritmo

    Heapsort. Para isto, voc pode seguir o Tutorial

    AED 007, desta srie, e/ou ler o captulo referen-

    te no livro-texto.

    Se voc estiver lendo este tutorial tenha certeza

    de ter seguido o Tutorial AED 007. Agora que

    voc seguiu todos os passos at aqui, est pronto

    para prosseguir com este tutorial.

    2 O ALGORITMO DE ORDENAO

    HEAPSORT

    2.1 REFAZ

    Refaz o heap.

    void refaz(int esq, int dir, int A[]) {

    int i, j, x;

    i = esq;

    j = 2 * i;

    x = A[i];

    while(j = A[j]) goto 999;

    A[i] = A[j];

    i = j;

    j = 2 * i;

    }

    999: A[i] = x;

    2.2 CONSTROI

    Constri o heap.

    void constroi(int n, int A[]) {

    int esq;

    esq = n / 2;

    while(esq > 0) {

    esq--;

    refaz(esq, n, A);

    }

    Usando o heap obtido pelo procedimento cons-

    tri, pega o elemento na posio 1 do vetor (raiz

    do heap) e troca com o item que est na posio

    n do vetor. Agora usando o procedimento refaz

    para reorganizar o heap para os itens A[1], A[2],

    ..., A[n-1]. Repete-se as duas operaes sucessi-

    vamente at que reste apenas um item.

  • 2

    2.3 HEAPSORT

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

    int esq, dir;

    esq = n / 2;

    dir = n - 1;

    while(esq > 1) {

    esq--;

    refaz(esq, dir, A);

    }

    while(dir > 1) {

    x = A[1];

    A[1] = A[dir]; A[dir] = x; dir--;

    refaz(esq, dir, A);

    }

    }

    2.1 COMPLEXIDADE DO HEAP-

    SORT Pior caso

    Analisando cada parte do algoritmo:

    algoritmo refaz

    se a rvore binria com n ns possui altura k,

    k o menor inteiro que satisfaz

    n 2k+1 1 e 2k n 2k+1 1, logo k = log n

    o procedimento atua entre os nveis o e (k-1)

    da subrvore, efetuando, em cada nvel, no

    mximo duas comparaes e uma troca. Por-

    tanto,

    = C(n) = 2k 2 log n C(n) = O(log n)

    T(n) = k log n M(n) = 3T(n) 3 log n

    M(n) = O(log n)

    algoritmo constri

    o algoritmo executa o algoritmo refaz (n div 2)

    vezes, portanto,

    C(n) (n/2) 2 log n = n log n O(n log n)

    T(n) (n/2) log n M(n) = 3T(n) 3n/2 log n

    = O(n log n)

    algoritmo heapsort

    a ordenao da estrutura heap requer a exe-

    cuo do refaz (n-1) vezes, portanto,

    C(n) (n-1) 2 log n C(n) = O(n log n)

    T(n) (n-1) log n M(n) = 3T(n) 3 (n-1) log n

    = O(n log n)

    portanto, no pior caso: M(n) = O(n log n)

    Caso Mdio

    Como nenhum algoritmo de ordenao pode ser

    inferior a O(n log n) e C(n) e M(n) so O(n log n),

    decorre que C(n) = O(n log n) e M(n) = O(n log n).

    2.2 MELHORIAS E IMPLEMENTAES

    2.2.1 MELHORIAS

    Um algoritmo de ordenao cai na famlia orde-

    nao adaptativa, se tira vantagem da ordena-

    o existente em sua entrada. Ele se beneficia do

    pr-ordenamento na sequncia de entrada - ou

    uma quantidade limitada de desordem para as

    diversas definies de medidas de desordem - e

    ordenao mais rapidamente. A ordenao adap-

    tativa normalmente realizada modificando-se os

    algoritmos de ordenao existentes.

    2.2.1.1 HEAPSORT ADAPTATIVO

    O Heapsort adaptativo um algoritmo de ordena-

    o que semelhante ao Heapsort, mas usa um

    rvore de busca binria aleatria para a estrutu-

    ra da entrada de acordo com uma ordem preexis-

    tente. A rvore de busca binria aleatria usada

    para selecionar os candidatos que so colocados

    no heap, de modo que o heap no precisa se

    manter a par de todos os elementos. O Heapsort

    adaptativo parte da famlia de algoritmos de

    ordenao adaptativos.

    O primeiro Heapsort adaptativo foi o Smoothsort

    de Dijkstra.

    2.2.1.1.1 SMOOTHSORT

    Algoritmo de ordenao relativamente simples.

    um algoritmo de ordenao por comparao.

    Smoothsort (mtodo) um algoritmo de ordena-

    o por comparao. uma variao do Heapsort

    desenvolvido por Edsger Dijkstra em 1981. Como

    o Heapsort, o limite superior do Smoothsort de

    O(n log n). A vantagem de Smoothsort que ele

    se aproxima de tempo O(n) se a entrada j tem

    algum grau de ordenao, enquanto a mdia do

    Heapsort de O(n log n), independentemente do

    estado inicial em termos de ordenao.

    Para uma anlise completa sobre o algoritmo

    Smoothsort, leia o excelente artigo O Algoritmo

    de Ordenao Smoothsort Explicado, Cadernos

    do IME Srie Informtica, volume 28, pgina

    23.

  • 3

    3 DESENVOLVA Tente criar algoritmos de ordenao heapsort

    genricos (que ordenem ascendente ou descen-

    dente e por qualquer chave fornecida) para os

    problemas a seguir.

    1. Ordenao de inteiros;

    2. Ordenao de strings;

    3. Ordenao de strings a partir de um dado

    caractere, por exemplo, a partir do 3 caracte-

    re;

    4. Ordenao de Estruturas por um campo es-

    colhido;

    5. Ordenao de estruturas por uma chave

    composta escolhida;

    4 EXERCCIOS PROPOSTOS 1. Crie um programa que faa uma comparao

    entre todos os mtodos de ordenao estuda-

    dos em aula com relao a estabilidade (pre-

    servar ordem lexicogrfica), ordem de com-

    plexidade levando em considerao compara-

    es e movimentaes para um vetor de 100

    inteiros contendo os 100 primeiros nmeros

    naturais em ordem decrescente.

    2. Escreva um programa para ordenar os 200

    primeiros nmeros da lista de 100000 nme-

    ros inteiros fornecida no blog, primeiro usan-

    do o pivot como o primeiro elemento, depois

    usando o pivot como o elemento central, de-

    pois usando um pivot escolhido aleatoriamen-

    te e por fim, um pivot usando a mediana en-

    tre trs o primeiro, o ltimo e elemento cen-

    tral dos valores.

    3. Escreva um programa que leia compromissos

    para uma agenda, anotando o assunto, a da-

    ta do compromisso (no formato dd/mm/aaaa)

    e a hora do compromisso (no formato hh:mm)

    e ordene os compromissos em ordem crescen-

    te de data, hora e assunto.

    4. Desenvolver os algoritmos Insero, sele-

    o, Shellsort, Quicksort e Heapsort em

    linguagem C. Usar um registro com trs cam-

    pos: Cdigo (numrico), Nome (string), Ende-

    reo (string). A ordenao deve ser pelo cdi-

    go. Os outros dados podem ser preenchidos

    aleatoriamente.

    Executar os programas com listas contendo

    100, 200 e 400 elementos na seguinte situa-

    o inicial:

    a) Lista inicial aleatria;

    b) Lista inicial ascendente;

    c) Lista inicial descendente.

    Os valores devem ser atribudos no prprio

    programa fonte ou lidos uma nica vez no

    incio da execuo. Calcular o tempo gasto

    em cada execuo.

    Colocar um contador para calcular o nmero

    de comparaes executadas. Ao final de cada

    execuo imprimir o contador. Ao final das

    execues, fazer uma tabela e comparar os

    resultados encontrados.

    No lugar do contador, colocar um delay. Cal-

    cular o tempo gasto. Ao final das execues,

    fazer uma tabela e comparar os resultados

    encontrados.

    Fazer um documento texto analisando os da-

    dos encontrados. Deve apresentar as tabelas

    com os dados encontrados e os valores espe-

    rados, quando possvel. O que se pode con-

    cluir observando os dados encontrados nos

    itens anteriores e a teoria apresentada? Apre-

    sente uma comparao com a complexidade

    apresenta