Você está na página 1de 89

Algoritmos e Estruturas de Dados II Ordenao

Rafael Sachetto Oliveira


sachetto@ufsj.edu.br

Slides baseados nos disponibilizados pelo livro-texto

DCOMP/UFSJ

AEDSII

Ordenacao

Ordenao - Conceitos Bsicos


Ordenar: processo de rearranjar um conjunto de objetos em ordem ascendente ou descendente Visa a facilitar a recuperao posterior de itens do conjunto ordenado Diculdade de se utilizar um catlogo telefnico se os nomes das pessoas no estivessem listados em ordem alfabtica Notao utilizada nos algoritmos: Trabalham sobre os registros de um arquivo Cada registro possui uma chave utilizada para controlar a ordenao Podem existir outros componentes em um registro

DCOMP/UFSJ

AEDSII

Ordenacao

Ordenao - Conceitos Bsicos


Estrutura de um item do arquivo typedef int ChaveTipo; typedef struct Item { ChaveTipo chave; /* outros componentes */ } Item;

Qualquer tipo de chave sobre o qual exista uma regra de ordenao bemdenida pode ser utilizado Um mtodo de ordenao estvel se a ordem relativa dos itens com chaves iguais no se altera durante a ordenao Alguns dos mtodos de ordenao mais ecientes no so estveis A estabilidade pode ser forada quando o mtodo no-estvel
DCOMP/UFSJ AEDSII

Ordenacao

Sedgewick (1988) sugere agregar um pequeno ndice a cada chave antes de ordenar, ou ento aumentar a chave de alguma outra forma

DCOMP/UFSJ

AEDSII

Ordenacao

Ordenao - Conceitos Bsicos


Classicao dos mtodos de ordenao: Ordenao interna: arquivo a ser ordenado cabe todo na memria principal Ordenao externa: arquivo a ser ordenado no cabe na memria principal Diferenas entre os mtodos: Em um mtodo de ordenao interna, qualquer registro pode ser imediatamente acessado Em um mtodo de ordenao externa, os registros so acessados seqencialmente ou em grandes blocos A maioria dos mtodos de ordenao baseada em comparaes das chaves Existem mtodos de ordenao que utilizam o princpio da distribuio

DCOMP/UFSJ

AEDSII

Ordenacao

Ordenao - Conceitos Bsicos


Exemplo de ordenao por distribuio: Considere o problema de ordenar um baralho com 52 cartas na ordem: A < 2 < 3 < . . . < 10 < J < Q < K e <<< Algoritmo: 1. Distribuir as cartas abertas em treze montes: ases, dois, trs, . . ., reis. 2. Coletar os montes na ordem especicada 3. Distribuir novamente as cartas abertas em quatro montes: paus, ouros, copas e espadas 4. Coletar os montes na ordem especicada

DCOMP/UFSJ

AEDSII

Ordenacao

Ordenao - Conceitos Bsicos


Mtodos como o ilustrado so tambm conhecidos como ordenao digital, radixsort ou bucketsort O mtodo no utiliza comparao entre chaves Diculdade de implementar (uma das): relacionada com o problema de lidar com cada monte Se para cada monte ns reservarmos uma rea, ento a demanda por memria extra pode tornar-se proibitiva

DCOMP/UFSJ

AEDSII

Ordenacao

Ordenao Interna
Na escolha de um algoritmo de ordenao interna deve ser considerado o tempo gasto pela ordenao Sendo n o nmero registros no arquivo, as medidas de complexidade relevantes so: Nmero de comparaes C(n) entre chaves Nmero de movimentaes M (n) de itens do arquivo O uso econmico da memria disponvel um requisito primordial na ordenao interna Mtodos de ordenao in situ so os preferidos Mtodos que utilizam listas encadeadas no so muito utilizados Mtodos que fazem cpias dos itens a serem ordenados possuem menor importncia
DCOMP/UFSJ AEDSII

Ordenacao

Ordenao Interna
Classicao dos mtodos de ordenao interna: Mtodos simples: Adequados para pequenos arquivos Requerem O(n2) comparaes Produzem programas pequenos Mtodos ecientes: Adequados para arquivos maiores Requerem O(n log n) comparaes Usam menos comparaes As comparaes so mais complexas nos detalhes Mtodos simples so mais ecientes para pequenos arquivos

DCOMP/UFSJ

AEDSII

Ordenacao

Ordenao Interna
Tipos de dados e variveis utilizados nos algoritmos de ordenao interna: typedef int Indice; typedef Item Vetor[MAX_TAM + 1]; Vetor A;

O ndice do vetor vai de 0 at M AX T AM + 1, devido s chaves sentinelas O vetor a ser ordenado contm chaves nas posies de 1 at n

DCOMP/UFSJ

AEDSII

Ordenacao

10

Ordenao por Seleo


Um dos algoritmos mais simples de ordenao Algoritmo: Selecione o menor item do vetor Troque-o com o item da primeira posio do vetor Repita essas duas operaes com os n 1 itens restantes, depois com os n 2 itens, at que reste apenas um elemento

DCOMP/UFSJ

AEDSII

Ordenacao

11

Ordenao por Seleo


void selecao(Vetor a, Indice *n) { Indice i, j, min; Item x; for (i = 1; i <= *n - 1; i++) { min = i; for (j = i + 1; j <= *n; j++) { if (a[j].chave < a[min].chave) { min = j; } } x = a[min]; a[min] = a[i]; a[i] = x; } }

DCOMP/UFSJ

AEDSII

Ordenacao

12

Ordenao por Seleo - Anlise


Comparaes entre chaves e movimentaes de registros: C(n) = n n 2 2 M (n) = 3(n 1) A atribuio min = j executada em mdia n log n vezes, Knuth (1973).
2

DCOMP/UFSJ

AEDSII

Ordenacao

13

Ordenao por Seleo


Vantagens: Custo linear no tamanho da entrada para o nmero de movimentos de registros o algoritmo a ser utilizado para arquivos com registros muito grandes muito interessante para arquivos pequenos Desvantagem: O fato de o arquivo j estar ordenado no ajuda em nada, pois o custo continua quadrtico O algoritmo no estvel

DCOMP/UFSJ

AEDSII

Ordenacao

14

Ordenao por Insero


Mtodo preferido dos jogadores de cartas Algoritmo: Em cada passo a partir de i = 2 faa: * Selecione o i-simo item da seqncia fonte * Coloque-o no lugar apropriado na seqncia destino de acordo com o critrio de ordenao

DCOMP/UFSJ

AEDSII

Ordenacao

15

Ordenao por Insero


void insercao(Vetor a, Indice *n) { Indice i, j; Item x; for (i = 2; i <= *n; i++) { x = a[i]; j = i - 1; a[0] = x; /* sentinela */ while (x.chave < a[j].chave) { a[j+1] = a[j]; j--; } a[j+1] = x; } }

DCOMP/UFSJ

AEDSII

Ordenacao

16

Ordenao por Insero


Consideraes sobre o algoritmo: O processo de ordenao pode ser terminado pelas condies: * Um item com chave menor que o item em considerao encontrado * O nal da seqncia destino atingido esquerda Soluo: Utilizar um registro sentinela na posio zero do vetor

DCOMP/UFSJ

AEDSII

Ordenacao

17

Ordenao por Insero - Anlise


Seja C(n) a funo que conta o nmero de comparaes No lao mais interno, na i-sima iterao, o valor de Ci melhor caso : Ci(n) = 1 pior caso : Ci(n) = i caso mdio : Ci(n) = 1 (1 + 2 + . . . + i) = i+1 i 2

Assumindo que todas as permutaes de n so igualmente provveis no caso mdio, temos: melhor caso: C(n) = (1 + 1 + . . . + 1) = n 1 2 pior caso: C(n) = (2 + 3 + . . . + n) = n + n 1 2 2
1 (3 + 4 + . . . + n + 1) = n2 + 3n 1 caso mdio: C(n) = 2 4 4

DCOMP/UFSJ

AEDSII

Ordenacao

18

Ordenao por Insero - Anlise


Seja M (n) a funo que conta o nmero de movimentaes de registros O nmero de movimentaes na i-sima iterao : M i(n) = Ci(n) 1 + 3 = Ci(n) + 2 Logo, o nmero de movimentos : melhor caso: M (n) = (3 + 3 + . . . + 3) = 3(n 1) 2 pior caso: M (n) = (4 + 5 + . . . + n + 2) = n + 5n 3 2 2

2 1 caso mdio : M (n) = 2 (5 + 6 + . . . + n + 3) = n + 11n 3 4 4

DCOMP/UFSJ

AEDSII

Ordenacao

19

Ordenao por Insero


O nmero mnimo de comparaes e movimentos ocorre quando os itens esto originalmente em ordem O nmero mximo ocorre quando os itens esto originalmente na ordem reversa o mtodo a ser utilizado quando o arquivo est quase ordenado um bom mtodo quando se deseja adicionar uns poucos itens a um arquivo ordenado, pois o custo linear O algoritmo de ordenao por insero estvel

DCOMP/UFSJ

AEDSII

Ordenacao

20

Shellsort
Proposto por Shell em 1959 uma extenso do algoritmo de ordenao por insero. Problema com o algoritmo de ordenao por insero: Troca a posio itens adjacentes para determinar o ponto de insero So efetuadas n 1 comparaes e movimentaes quando o menor item est na posio mais direita no vetor O mtodo de Shell contorna este problema permitindo trocas de registros distantes um do outro

DCOMP/UFSJ

AEDSII

Ordenacao

21

Shellsort
Os itens separados de h posies so rearranjados Todo h-simo item leva a uma seqncia ordenada Tal sequncia dita estar h-ordenada Exemplo de utilizao:

Quando h = 1 Shellsort corresponde ao algoritmo de ordenao por insero


DCOMP/UFSJ AEDSII

Ordenacao

22

Shellsort
Como escolher o valor de h Sequncia para h: h(s) = 3h(s 1) + 1 para s > 1 h(s) = 1, para s = 1 Knuth (1973) mostrou experimentalmente que esta seqncia difcil de ser batida por mais de 20% em ecincia A seqncia para h corresponde a 1, 4, 13, 40, 121, 364, 1.093, 3.280, . . .

DCOMP/UFSJ

AEDSII

Ordenacao

23

Shellsort
void shellsort(Vetor a, Indice *n);

DCOMP/UFSJ

AEDSII

Ordenacao

24

Shellsort
void shellsort(Vetor a, Indice *n) { int i, j; int h = 1; Item x; do h = h * 3 + 1; while (h < *n); do { h /= 3; for (i = h + 1; i <= *n; i++) { x = a[i]; j = i; while (a[j - h].chave > x.chave) { a[j] = a[j - h]; j -= h; if (j <= h) break; } a[j] = x; } } while (h != 1); }
DCOMP/UFSJ AEDSII

Ordenacao

25

Shellsort
A implementao do Shellsort no utiliza registros sentinelas Seriam necessrios h registros sentinelas, uma para cada h-ordenao

DCOMP/UFSJ

AEDSII

Ordenacao

26

Shellsort
A razo da ecincia do algoritmo ainda no conhecida Ningum ainda foi capaz de analisar o algoritmo A sua anlise contm alguns problemas matemticos muito difceis, a comear pela prpria sequncia de incrementos O que se sabe que cada incremento no deve ser mltiplo do anterior Conjecturas referente ao nmero de comparaes para a seqncia de Knuth: Conjectura 1: C(n) = O(n1,25) Conjectura 2: C(n) = O(n(ln n)2)

DCOMP/UFSJ

AEDSII

Ordenacao

27

Shellsort
Vantagens: Shellsort uma tima opo para arquivos de tamanho moderado Sua implementao simples e requer uma quantidade de cdigo pequena Desvantagens: O tempo de execuo do algoritmo sensvel ordem inicial do arquivo O mtodo no estvel

DCOMP/UFSJ

AEDSII

Ordenacao

28

Quicksort
Proposto por Hoare em 1960 e publicado em 1962 o algoritmo de ordenao interna mais rpido que se conhece para uma ampla variedade de situaes Provavelmente o mais utilizado A idia bsica dividir o problema de ordenar um conjunto com n itens em dois problemas menores Os problemas menores so ordenados independentemente Os resultados so combinados para produzir a soluo nal

DCOMP/UFSJ

AEDSII

Ordenacao

29

Quicksort
A parte mais delicada do mtodo o processo de partio O vetor A[Esq..Dir] rearranjado por meio da escolha arbitrria de um piv x O vetor A particionado em duas partes: A parte esquerda com chaves menores ou iguais a x A parte direita com chaves maiores ou iguais a x

DCOMP/UFSJ

AEDSII

Ordenacao

30

Quicksort
Algoritmo para o particionamento: 1. Escolha arbitrariamente um piv x 2. Percorra o vetor a partir da esquerda at que A[i] x 3. Percorra o vetor a partir da direita at que A[j] x 4. Troque A[i] com A[j] 5. Continue este processo at os apontadores i e j se cruzarem Ao nal, o vetor A[Esq..Dir] est particionado de tal forma que: Os itens em A[esq], A[esq + 1], . . . , A[j] so menores ou iguais a x Os itens em A[i], A[i + 1], . . . , A[dir] so maiores ou iguais a x

DCOMP/UFSJ

AEDSII

Ordenacao

31

Quicksort
Ilustrao do processo de partio:

O piv x escolhido como sendo A[(i + j)div2] Como inicialmente i = 1 e j = 6, ento x = A[3] = D Ao nal do processo de partio, i e j se cruzam em i = 3 e j = 2
DCOMP/UFSJ AEDSII

Ordenacao

32

Quicksort
void particionar(Indice esq, Indice dir, Indice *i, Indice *j, Vetor a) { Item x, w; *i = esq; *j = dir; x = a[(*i + *j) / 2]; /* obtem o pivo x */ do { while (x.chave > a[*i].chave) (*i)++; while (x.chave < a[*j].chave) (*j)--; if (*i <= *j) { w = a[*i]; a[*i] = a[*j]; a[*j] = w; (*i)++; (*j)--; } } while (*i <= *j); }

DCOMP/UFSJ

AEDSII

Ordenacao

33

Quicksort
O anel interno do procedimento particionar extremamente simples (razo pela qual o algoritmo Quicksort to rpido)

DCOMP/UFSJ

AEDSII

Ordenacao

34

Procedimento Quicksort
void ordenar(Indice esq, Indice dir, Vetor a) { Indice i, j; particionar(esq, dir, &i, &j, a); if (esq < j) ordenar(esq, j, a); if (i < dir) ordenar(i, dir, a); } void quicksort(Vetor a, Indice *n) { ordenar(1, *n, a); }

DCOMP/UFSJ

AEDSII

Ordenacao

35

Procedimento Quicksort
Exemplo do estado do vetor em cada chamada recursiva do procedimento Ordena:

DCOMP/UFSJ

AEDSII

Ordenacao

36

Quicksort - Anlise
Seja C(n) a funo que conta o nmero de comparaes Pior caso: C(n) = O(n2) Ocorre quando o piv escolhido sempre como sendo um dos extremos de um arquivo j ordenado Isto faz com que o procedimento ordenar seja chamado recursivamente n vezes, eliminando apenas um item em cada chamada O pior caso pode ser evitado empregando pequenas modicaes no algoritmo Basta escolher trs itens quaisquer do vetor e usar a mediana dos trs como piv

DCOMP/UFSJ

AEDSII

Ordenacao

37

Quicksort - Anlise
Melhor caso: C(n) = 2C(n/2) + n = n log n n + 1 Ocorre quando cada partio divide o arquivo em duas partes iguais Caso mdio de acordo com Sedgewick e Flajolet (1996) C(n) 1, 386n log n 0, 846n Isso signica que, em mdia, o tempo de execuo do Quicksort O(n log n)

DCOMP/UFSJ

AEDSII

Ordenacao

38

Quicksort
Vantagens: extremamente eciente para ordenar arquivos de dados Necessita de apenas uma pequena pilha como memria auxiliar Requer cerca de n log n comparaes em mdia para ordenar n itens Desvantagens: Pior caso: O(n2) comparaes Implementao muito delicada e difcil:Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados No estvel

DCOMP/UFSJ

AEDSII

Ordenacao

39

Heapsort
Possui o mesmo princpio de funcionamento da ordenao por seleo Algoritmo: 1. Selecione o menor item do vetor 2. Troque-o com o item da primeira posio do vetor 3. Repita estas operaes com os n 1 itens restantes, depois com os n 2 itens, e assim sucessivamente O custo para encontrar o menor (ou o maior) item entre n itens n 1 comparaes Isso pode ser reduzido utilizando uma la de prioridades

DCOMP/UFSJ

AEDSII

Ordenacao

40

Heapsort - Filas de Prioridades


uma estrutura de dados na qual a chave de cada item reete sua habilidade relativa de abandonar o conjunto de itens rapidamente Aplicaes: SOs usam las de prioridades, nas quais as chaves representam o tempo em que eventos devem ocorrer Mtodos numricos iterativos so baseados na seleo repetida de um item com maior (menor) valor Sistemas de gerncia de memria usam a tcnica de substituir a pgina menos utilizada na memria principal por uma nova pgina

DCOMP/UFSJ

AEDSII

Ordenacao

41

Heapsort - Filas de Prioridades - TAD


Operaes: 1. Construir uma la de prioridades a partir de um conjunto com n itens 2. Informar qual o maior item do conjunto 3. Retirar o item com maior chave 4. Inserir um novo item 5. Aumentar o valor da chave do item i para um novo valor que maior que o valor atual da chave 6. Substituir o maior item por um novo item, a no ser que o novo item seja maior 7. Alterar a prioridade de um item 8. Remover um item qualquer 9. Ajuntar duas las de prioridades em uma nica

DCOMP/UFSJ

AEDSII

Ordenacao

42

Heapsort - Filas de Prioridades - Representao


Lista linear ordenada: Construir: O(n log n) Inserir: O(n) Retirar: O(1) Ajuntar: O(n) Lista linear no-ordenada: Construir: O(n) Inserir: O(1) Retirar: O(n) Ajuntar: O(1) para apontadores e O(n) para arranjos

DCOMP/UFSJ

AEDSII

Ordenacao

43

Heapsort - Filas de Prioridades - Representao


A melhor representao atravs de uma estruturas de dados chamada heap: Neste caso, Construir O(n) Inserir, Retirar, Substituir e Alterar so O(logn) Observao: Para implementar a operao Ajuntar de forma eciente e ainda preservar um custo logartmico para as operaes Inserir, Retirar, Substituir e Alterar necessrio utilizar estruturas de dados mais sosticadas, tais como rvores binomiais (Vuillemin, 1978).

DCOMP/UFSJ

AEDSII

Ordenacao

44

Heapsort - Filas de Prioridades - Algoritmos de Ordenao


As operaes das las de prioridades podem ser utilizadas para implementar algoritmos de ordenao Basta utilizar repetidamente a operao Insere para construir a la de prioridades Em seguida, utilizar repetidamente a operao Retira para receber os itens na ordem reversa O uso de listas lineares no ordenadas corresponde ao mtodo da seleo O uso de listas lineares ordenadas corresponde ao mtodo da insero O uso de heaps corresponde ao mtodo Heapsort
DCOMP/UFSJ AEDSII

Ordenacao

45

Heapsort - Heaps
uma seqncia de itens com chaves c[1], c[2], . . . , c[n], tal que: c[i] c[2i], c[i] c[2i + 1], para todo i = 1, 2, . . . , n/2 A denio pode ser facilmente visualizada em uma rvore binria completa:

rvore binria completa: Os ns so numerados de 1 a n O primeiro n chamado raiz


DCOMP/UFSJ AEDSII

Ordenacao

46

O n k/2 o pai do n k, para 1 < k n Os ns 2k e 2k + 1 so os lhos esquerda e direita do n k, para 1 k n/2

DCOMP/UFSJ

AEDSII

Ordenacao

47

Heapsort - Heaps
As chaves na rvore satisfazem a condio do heap A chave em cada n maior do que as chaves em seus lhos A chave no n raiz a maior chave do conjunto Uma rvore binria completa pode ser representada por um array:

A representao extremamente compacta Permite caminhar pelos ns da rvore facilmente Os lhos de um n i esto nas posies 2i e 2i + 1 O pai de um n i est na posio i div 2
DCOMP/UFSJ AEDSII

Ordenacao

48

Heapsort - Heaps
Na representao do heap em um arranjo, a maior chave est sempre na posio 1 do vetor Os algoritmos para implementar as operaes sobre o heap operam ao longo de um dos caminhos da rvore Um algoritmo elegante para construir o heap foi proposto por Floyd em 1964 O algoritmo no necessita de nenhuma memria auxiliar Dado um vetor A[1], A[2], . . . , A[n], os itens A[n/2 + 1], A[n/2 + 2], . . . , A[n] formam um heap: Neste intervalo no existem dois ndices i e j tais que j = 2i ou j = 2i+1

DCOMP/UFSJ

AEDSII

Ordenacao

49

Heapsort - Heaps
Algoritmo:

Os itens de A[4] a A[7] formam um heap O heap estendido para a esquerda (Esq = 3), englobando o item A[3], pai dos itens A[6] e A[7] A condio de heap violada:
DCOMP/UFSJ AEDSII

Ordenacao

50

O heap refeito trocando os itens D e S O item R incluindo no heap (esq = 2), o que no viola a condio de heap O item O incluindo no heap (esq = 1) A Condio de heap violada: O heap refeito trocando os itens O e S, encerrando o processo

DCOMP/UFSJ

AEDSII

Ordenacao

51

Heapsort - Heaps
void refazer(Indice esq, Indice dir, Vetor a) { Indice i = esq; int j; Item x; j = i * 2; x = a[i]; while (j <= dir) { if (j < dir) { if (a[j].chave < a[j+1].chave) j++; } if (x.chave >= a[j].chave) break; a[i] = a[j]; i = j; j = i * 2; } a[i] = x; }
DCOMP/UFSJ AEDSII

Ordenacao

52

Heapsort - Heaps
void construir(Vetor a, Indice *n) { Indice esq; esq = *n / 2 + 1; while (esq > 1) { esq--; refazer(esq, *n, a); } }

DCOMP/UFSJ

AEDSII

Ordenacao

53

Heapsort - Algoritmo

1. Construir o heap 2. Trocar o item na posio 1 do vetor (raiz do heap) com o item da posio n 3. Use o procedimento refazer para reconstituir o heap para os itens A[1], A[2], . . . , A[n 1] 4. Repita os passos 2 e 3 com os n 1 itens restantes, depois com os n 2, at que reste apenas um item

DCOMP/UFSJ

AEDSII

Ordenacao

54

Heapsort - Exemplo

O caminho seguido pelo procedimento refazer para reconstituir a condio do heap est em negrito Por exemplo, aps a troca dos itens S e D na segunda linha da Figura, o item D volta para a posio 5, aps passar pelas posies 1 e 2
DCOMP/UFSJ AEDSII

Ordenacao

55

Heapsort - Algoritmo
void heapsort(Vetor a, Indice *n) { Indice esq, dir; Item x; construir(a, n); /* constroi o heap */ esq = 1; dir = *n; while (dir > 1) { /* ordena o vetor */ x = a[1]; a[1] = a[dir]; a[dir] = x; dir--; refazer(esq, dir, a); } }

DCOMP/UFSJ

AEDSII

Ordenacao

56

Heapsort - Anlise
O procedimento refazer gasta cerca de log n operaes, no pior caso Logo, Heapsort gasta um tempo de execuo proporcional a n log n, no pior caso

DCOMP/UFSJ

AEDSII

Ordenacao

57

Heapsort
Vantagem: O comportamento do Heapsort sempre O(n log n), qualquer que seja a entrada. Desvantagens: O anel interno do algoritmo bastante complexo se comparado com o do Quicksort No estvel Recomendado: Para aplicaes que no podem tolerar eventualmente um caso desfavorvel No recomendado para arquivos com poucos registros, por causa do tempo necessrio para construir o heap
DCOMP/UFSJ AEDSII

Ordenacao

58

Comparao entre os Mtodos - Complexidade

Apesar de no se conhecer analiticamente o comportamento do Shellsort, ele considerado um mtodo eciente

DCOMP/UFSJ

AEDSII

Ordenacao

59

Comparao entre os Mtodos - Tempo de Execuo


Oservao: O mtodo que levou menos tempo real para executar recebeu o valor 1 e os outros receberam valores relativos a ele Registros na ordem aleatria:

DCOMP/UFSJ

AEDSII

Ordenacao

60

Comparao entre os Mtodos - Tempo de Execuo


Registros na ordem ascendente:

DCOMP/UFSJ

AEDSII

Ordenacao

61

Comparao entre os Mtodos - Tempo de Execuo


Registros na ordem descendente:

DCOMP/UFSJ

AEDSII

Ordenacao

62

Comparao entre os Mtodos - Observaes


1. Shellsort, Quicksort e Heapsort tm a mesma ordem de grandeza O Quicksort o mais rpido para todos os tamanhos aleatrios experimentados A relao Heapsort/Quicksort se mantm constante para todos os tamanhos A relao Shellsort/Quicksort aumenta medida que o nmero de elementos aumenta Para arquivos pequenos (500 elementos), o Shellsort mais rpido que o Heapsort Quando o tamanho da entrada cresce, o Heapsort mais rpido que o Shellsort
DCOMP/UFSJ AEDSII

Ordenacao

63

O Insero o mais rpido para qualquer tamanho se os elementos esto ordenados O Insero o mais lento para qualquer tamanho se os elementos esto em ordem descendente Entre os algoritmos de custo O(n2), o Insero melhor para todos os tamanhos aleatrios experimentados

DCOMP/UFSJ

AEDSII

Ordenacao

64

Comparao entre os Mtodos - Insero


o mais interessante para arquivos com menos do que 20 elementos O mtodo estvel Possui comportamento melhor do que o mtodo da bolha (Bubblesort) que tambm estvel Sua implementao to simples quanto as implementaes do Bubblesort e Seleo Para arquivos j ordenados, o mtodo O(n) O custo linear para adicionar alguns elementos a um arquivo j ordenado

DCOMP/UFSJ

AEDSII

Ordenacao

65

Comparao entre os Mtodos - Seleo


vantajoso quanto ao nmero de movimentos de registros, que O(n) Deve ser usado para arquivos com registros muito grandes, desde que o tamanho do arquivo no exceda 1.000 elementos

DCOMP/UFSJ

AEDSII

Ordenacao

66

Comparao entre os Mtodos - Shellsort


o mtodo a ser escolhido para a maioria das aplicaes por ser muito eciente para arquivos de tamanho moderado Mesmo para arquivos grandes, o mtodo cerca de apenas duas vezes mais lento do que o Quicksort Sua implementao simples e geralmente resulta em um programa pequeno No possui um pior caso ruim e quando encontra um arquivo parcialmente ordenado trabalha menos

DCOMP/UFSJ

AEDSII

Ordenacao

67

Comparao entre os Mtodos - Quicksort


o algoritmo mais eciente que existe para uma grande variedade de situaes um mtodo bastante frgil no sentido de que qualquer erro de implementao pode ser difcil de ser detectado O algoritmo recursivo, o que demanda uma pequena quantidade de memria adicional Seu desempenho da ordem de O(n2) operaes no pior caso O principal cuidado a ser tomado com relao escolha do piv A escolha do elemento do meio do arranjo melhora muito o desempenho quando o arquivo est total ou parcialmente ordenado
DCOMP/UFSJ AEDSII

Ordenacao

68

O pior caso tem uma probabilidade muito remota de ocorrer quando os elementos forem aleatrios

DCOMP/UFSJ

AEDSII

Ordenacao

69

Comparao entre os Mtodos - Quicksort


Geralmente se usa a mediana de uma amostra de trs elementos para evitar o pior caso Esta soluo melhora o caso mdio ligeiramente Outra importante melhoria para o desempenho do Quicksort evitar chamadas recursivas para pequenos subarquivos Para isto, basta chamar um mtodo de ordenao simples nos arquivos pequenos A melhoria no desempenho signicativa, podendo chegar a 20% para a maioria das aplicaes (Sedgewick, 1988)

DCOMP/UFSJ

AEDSII

Ordenacao

70

Comparao entre os Mtodos - Heapsort


um mtodo de ordenao elegante e eciente Apesar de ser cerca de duas vezes mais lento do que o Quicksort, no necessita de nenhuma memria adicional Executa sempre em tempo proporcional a nlogn Aplicaes que no podem tolerar eventuais variaes no tempo esperado de execuo devem usar o Heapsort

DCOMP/UFSJ

AEDSII

Ordenacao

71

Comparao entre os Mtodos - Consideraes Finais


Para registros muito grandes desejvel que o mtodo de ordenao realize apenas n movimentos dos registros Com o uso de uma ordenao indireta possvel conseguir isso Suponha que o arquivo A[1], A[2], . . . , A[n] A contenha os seguintes registros:

Seja P um arranjo P [1], P [2], . . . , P [n] de apontadores Os registros somente so acessados para ns de comparaes e toda movimentao realizada sobre os apontadores Ao nal, P [1] contm o ndice do menor elemento de A, P [2] o ndice do segundo menor e assim sucessivamente
DCOMP/UFSJ AEDSII

Ordenacao

72

Essa estratgia pode ser utilizada para qualquer dos mtodos de ordenao interna

DCOMP/UFSJ

AEDSII

Ordenacao

73

Mergesort
Mtodo particular Aplica a tcnica de Projeto de Algoritmos (AEDSIII) "Dividir para Conquistar" Divide o vetor em 2 sub-vetores de comprimento n/2 e n/2 Ordena recursivamente cada sub-vetor Intercala os sub-vetores (merge)

DCOMP/UFSJ

AEDSII

Ordenacao

74

Mergesort - Exemplo

DCOMP/UFSJ

AEDSII

Ordenacao

75

Mergesort - Merge
Normalmente, precisa de um vetor auxiliar para manter a ordenao dos subvetores (ou seja, no in situ) (mas possivel implementar com apenas um vetor)

DCOMP/UFSJ

AEDSII

Ordenacao

76

Mergesort
void mergeSort(int vec[], int vecSize) { int mid; if (vecSize > 1) { mid = vecSize / 2; mergeSort(vec, mid); mergeSort(vec + mid, vecSize - mid); merge(vec, vecSize); } }

DCOMP/UFSJ

AEDSII

Ordenacao

77

Mergesort - Merge
void merge(int vec[], int vecSize) { int mid; int i, j, k; int* tmp; tmp = (int*) malloc(vecSize * sizeof(int)); if (tmp == NULL) { exit(1); } mid = vecSize / 2; i = 0; j = mid; k = 0; while (i < mid && j < vecSize) { if (vec[i] < vec[j]) { tmp[k] = vec[i]; ++i; } else { tmp[k] = vec[j]; ++j; } ++k; } if (i == mid) { while (j < vecSize) {tmp[k] = vec[j]; ++j; ++k; } } else { while (i < mid) {tmp[k] = vec[i]; ++i; ++k;} for (i = 0; i < vecSize; ++i) {vec[i] = tmp[i];} free(tmp); }
DCOMP/UFSJ AEDSII

Ordenacao

78

Mergesort
Complexidade: O(n log n) Vantagens: complexidade constante; implementao simples Desvantagem: Alto uso de memria (pela necessidade de copiar o vetor e pelas chamadas recursivas) Uso: necessidade de complexidade constante; memria no problema

DCOMP/UFSJ

AEDSII

Ordenacao

79

Ordenao Externa
Consiste em ordenar arquivos de tamanho maior que a memria interna disponvel Mtodos muito diferentes dos de ordenao interna Algoritmos devem diminuir o nmero de acesso as unidades de memria externa Nas memrias externas, os dados so armazenados como um arquivo seqencial Apenas um registro pode ser acessado em um dado momento Esta uma restrio forte se comparada com as possibilidades de acesso em um vetor
DCOMP/UFSJ AEDSII

Ordenacao

80

Logo, os mtodos de ordenao interna so inadequados para ordenao externa Tcnicas de ordenao completamente diferentes devem ser utilizadas

DCOMP/UFSJ

AEDSII

Ordenacao

81

Ordenao Externa
Fatores que determinam as diferenas das tcnicas de ordenao externa: Custo para acessar um item algumas ordens de grandeza maior O custo principal na ordenao externa relacionado a transferncia de dados entre a memria interna e externa Existem restries severas de acesso aos dados O desenvolvimento de mtodos de ordenao externa muito dependente do estado atual da tecnologia A variedade de tipos de unidades de memria externa torna os mtodos dependentes de vrios parmetros Assim, apenas mtodos gerais sero apresentados

DCOMP/UFSJ

AEDSII

Ordenacao

82

Ordenao Externa
O mtodo mais importante o de ordenao por intercalao Intercalar signica combinar dois ou mais blocos ordenados em um nico bloco ordenado A intercalao utilizada como uma operao auxiliar na ordenao Estratgia geral dos mtodos de ordenao externa: Quebre o arquivo em blocos do tamanho da memria interna disponvel Ordene cada bloco na memria interna Intercale os blocos ordenados, fazendo vrias passadas sobre o arquivo A cada passada so criados blocos ordenados cada vez maiores, at que todo o arquivo esteja ordenado

DCOMP/UFSJ

AEDSII

Ordenacao

83

Ordenao Externa
Os algoritmos para ordenao externa devem reduzir o nmero de passadas sobre o arquivo Uma boa medida de complexidade de um algoritmo de ordenao por intercalao o nmero de vezes que um item lido ou escrito na memria auxiliar Os bons mtodos de ordenao geralmente envolvem no total menos do que dez passadas sobre o arquivo

DCOMP/UFSJ

AEDSII

Ordenacao

84

Ordenao Externa - Intercalao Balanceada de Vrios Caminhos


Considere um arquivo armazenado em uma ta de entrada: INTERCALACAOBALANCEADA Objetivo: Ordenar os 22 registros e coloc-los em uma ta de sada Os registros so lidos um aps o outro Considere uma memria interna com capacidade para para trs registros Considere que estejam disponveis seis unidades de ta magntica

DCOMP/UFSJ

AEDSII

Ordenacao

85

Ordenao Externa - Intercalao Balanceada de Vrios Caminhos


Fase de criao dos blocos ordenados

DCOMP/UFSJ

AEDSII

Ordenacao

86

Ordenao Externa - Intercalao Balanceada de Vrios Caminhos


Fase de intercalao - Primeira passada: 1. O primeiro registro de cada ta lido 2. Retire o registro contendo a menor chave. 3. Armazene-o em uma ta de sada. 4. Leia um novo registro da ta de onde o registro retirado proveniente 5. Ao ler o terceiro registro de um dos blocos, sua ta ca inativa 6. A ta reativada quando o terceiro registro das outras tas forem lidos 7. Neste instante um bloco de nove registros ordenados foi formado na ta de sada 8. Repita o processo para os blocos restantes Resultado da primeira passada da segunda etapa:

DCOMP/UFSJ

AEDSII

Ordenacao

87

Ordenao Externa - Intercalao Balanceada de Vrios Caminhos


Quantas passadas so necessrias para ordenar um arquivo de tamanho arbitrrio? Seja n, o nmero de registros do arquivo Suponha que cada registro ocupa m palavras na memria interna A primeira etapa produz n/m blocos ordenados Seja P (n) o nmero de passadas para a fase de intercalao Seja f o nmero de tas utilizadas em cada passada Assim: n P (n) = logf m No exemplo acima, n = 22, m = 3 e f = 3, temos: P (n) = log3 22 = 2 3

DCOMP/UFSJ

AEDSII

Ordenacao

88

Ordenao Externa - Intercalao Balanceada de Vrios Caminhos


No exemplo foram utilizadas 2f tas para uma intercalao-de-f -caminhos possvel usar apenas f + 1 tas: Encaminhe todos os blocos para uma nica ta Redistribuia estes blocos entre as tas de onde eles foram lidos O custo envolvido uma passada a mais em cada intercalao No caso do exemplo de 22 registros, apenas quatro tas seriam sucientes: A intercalao dos blocos a partir das tas 1, 2 e 3 seria toda dirigida para a ta 4 Ao nal, o segundo e o terceiro blocos ordenados de nove registros seriam transferidos de volta para as tas 1 e 2

DCOMP/UFSJ

AEDSII

Ordenacao

89