Capítulo 9
Ordenação


[RTF] [PowerPoint] [PostScript]

9.1 Introdução à Ordenação

9.2 Quicksort 9.3 HeapSort 9.4 Exercícios


9.1 Introdução à Ordenação

9.1.1 Conceitos básicos em Ordenação

Localização de Execução:

Estabilidade:

Uma ordenação pode ocorrer sobre os próprios registros ou sobre uma tabela auxiliar de ponteiros.

9.1.2 Critérios para Selecionar uma Ordenação

Eficiência de Espaço

9.1.2.1 Aspectos da Eficiência de Tempo


9.2 Quicksort


Algoritmo Básico


Particionamento em Quicksort

  1. o elemento a[i] está em seu lugar final no arquivo para um i dado,
  2. nenhum dos elementos em a[esq],...,a[i-1] são maiores do que a[i],
  3. nenhum dos elementos em a[i+1],...,a[dir] são menores do que a[i].


Exemplo


Visão da Recursividade do Quicksort como Árvore:


Método para o Particionamento


Algoritmo de Particionamento

inteiro partição(tipoInfo : a[], inteiro : limInf, limSup)
        variáveis
                tipoInfo : x, temp; inteiro : baixo, alto;
        início
                x <- a[limInf]; alto <- limSup; baixo <- limInf + 1;
                enquanto (baixo < alto) faça
                        enquanto (a[baixo] <= x E baixo < limSup) faça
                                incremente baixo;               /* Sobe no arquivo */
                        enquanto (a[alto] > x) faça
                                decremente alto;                /* Desce no arquivo */ 
                        se (baixo < alto) então /* Troca */
                                temp <- a[baixo];
                                a[baixo] <- a[alto];
                                a[alto] <- temp;
                        fim se
                fim enquanto
                a[limInf] <- a[alto];
                a[alto] <- x;
                retorne alto;
        fim

Comentários sobre o Quicksort


9.3 HeapSort


9.3.1 Preâmbulo: Árvore Heap


9.3.2 Método em HeapSort

É um método em três estágios:

Visão do arquivo x1,...xn por Níveis:


Árvore-Heap a partir do Arquivo

Arquivo Original por Níveis
Árvore Heap Resultante


Algoritmo HeapSort

heapsort( tipoInfo : a[], inteiro : n)
        variáveis
                inteiro         :       i;
                tipoInfo        :       temp;
        início
                para I de (n div 2) até 1 passo -1 faça
                        ajuste(a, I, n);        /* Converta a em um heap */
                fim para
                para I de (n-1) até 1 passo -1 faça
                        temp <- a[I+1];
                        a[I+1] <- a[1]; /* Supõe posição inicial = 1 */
                        a[1] <- temp;
                        ajuste(a,1,I);  /* Restabeleça o heap */
                fim para
        fim


Algoritmo do Ajuste

ajuste( tipoInfo : a[], inteiro : i, n)
        variáveis
                inteiro         :       j;
                tipoInfo        :       aAux;
        início
                aAux <- a[i]            /* Supõe posição inicial = 1 */
                j <- 2*i;
                enquanto j <= n faça
                        se j < n E a[j] < a[j+1] então
                                incremente j;
                        fim se
                        se aAux >= a[j] então
                                retorne
                        fim se
                        a[j div 2] <- a[j]; 
                        a[j] <- aAux;   /* falta no algoritmo dado em
                                           Horowitz&Sahni */
                        j <- 2*j;
                fim enquanto
                a[j div 2] <- aAux;
        fim


9.4 Exercícios