5. Algoritmos de Ordenação

Documentos relacionados
Métodos de Ordenação

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

QuickSort. Estrutura de Dados II Jairo Francisco de Souza

Ordenação em Memória Primária Estrutura de Dados II

Quicksort. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Busca em Memória Primária Estrutura de Dados II

Estruturas de Dados 2

Existem duas categorias de algoritmos de ordenação: Os algoritmos de ordenação são avaliados de acordo com os seguintes critérios:

QuickSort. Algoritmos e Estruturas de Dados Verão Cátia Vaz 1

O mais leve e o mais pesado Algoritmos de Ordenação

INF111 Programação II Aulas 11, 12, 13 Ordenação

Quicksort [1] Quicksort [2]

Análise e Síntese de Algoritmos. Revisão CLRS, Cap. 7-10

Quicksort Letícia Rodrigues Bueno

Complexidade Assintótica de Programas Letícia Rodrigues Bueno

Método BubbleSort. Estrutura de Dados II Prof Jairo Francisco de Souza

Algoritmos e Estruturas de Dados II. Ordenação

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1

Memória secundária. Memória secundária

7. Introdução à Complexidade de Algoritmos

Universidade da Madeira. 1. Recursão. 3. Busca. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 2

O Problema da Ordenação Métodos de Ordenação Parte 1

Departamento de Engenharia Rural Centro de Ciências Agrárias. Programação I

Ordenação Externa. Ordenação Externa. Ordenação Externa. Ordenação Externa

Métodos de ordenação. Bubble sort:

6. Pesquisa e Ordenação

Pesquisa sequencial e pesquisa binária

Análise e Projeto de Algoritmos

Universidade Federal do Espírito Santo

BCC202 - Estrutura de Dados I

3. Conteúdo de um vértice v é conteúdo dos filhos de v.

Ordenação de Dados (III) HeapSort

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

INF1007: Programação 2 7 Busca em Vetores. 01/04/2014 (c) Dept. Informática - PUC-Rio 1

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Quantidade de memória necessária

Programação de Computadores II. Cap. 17 Busca

Ordenação em tempo linear

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca

ORDENAÇÃO E BUSCA 1. MÉTODOS DE ORDENAÇÃO

FACULDADE CAMPO LIMPO PAULISTA BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto a Análise de Algoritmos I Lista de Exercícios 1

2. Ordenação por Seleção

Vença o relógio Redes de Ordenação

Lista de exercícios sobre contagem de operações Prof. João B. Oliveira

Complexidade de Algoritmos

Introdução Métodos de Busca Parte 1

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

Simulador didático de testes de algoritmos de ordenação

Ordenação de Vectores

Árvores B Parte III. Propriedades, Remoção & Inserção Revisitada. Adaptado e Estendido dos Originais de:

Aprendendo a Programar Programando numa Linguagem Algorítmica Executável (ILA)

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

BCC202 - Estrutura de Dados I

DAINF - Departamento de Informática

Algoritimos e Estruturas de Dados III CIC210

Aula 19 Conjuntos disjuntos (Union-find)

Algoritmos de Ordenação e Pesquisa. Marco Antonio Moreira de Carvalho Algoritmos e Estrutura de Dados

Capítulo 14. Ordenação e pesquisa. Bubblesort. Alguns algoritmos de ordenação e pesquisa Medição do tempo de execução de um programa

QuickSort CI/2015. Análise e Projeto de Algoritmos. - Prof. Lucídio A. F. Cabral

Projeto de Algoritmos e Indução Matemática

FACULDADE DE IMPERATRIZ - FACIMP BACHARELADO EM SISTEMAS DE INFORMAÇÃO ESTRUTURA DE DADOS 2. Vieira Lima Junior. Everson Santos Araujo

Linguagem Haskell. Maria Adriana Vidigal de Lima

Métodos de Pesquisa de Dados (II) Árvore N-ária de Pesquisa

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Trabalho: Algoritmos de Busca e Ordenação. 1 Introdução. Prof. Bruno Emerson Gurgel Gomes IFRN - Câmpus Currais Novos. 31 de outubro de 2012

Arquivos Sequenciais Ordenados Fisicamente

Teoria dos Grafos Aula 24

Algoritmos. para concursos. Questões comentadas

BC1424 Algoritmos e Estruturas de Dados I Aula 05 Custos de um algoritmo e funções de complexidade

Estruturas de Dados 2

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Algoritmos de Pesquisa e Ordenação em Vectores

Método de ordenação - objetivos:

Teoria da Computação. Aula 9 Pesquisa em Memória Secundária 5COP096. Aula 9 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Listas de Prioridade. Fonte de consulta: Szwarcfiter, J.; Markezon, L. Estruturas de Dados e seus Algoritmos, 3a. ed. LTC.

Algoritmos de Ordenação

Tópicos Avançados em Algoritmos

Estruturas de Dados 2

Mergesort. Aula 04. Algoritmo Mergesort. Divisão e Conquista. Divisão e Conquista- MergeSort

Sistemas Distribuídos: Princípios e Algoritmos Introdução à Análise de Complexidade de Algoritmos

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Análise de Algoritmos

Hashing: conceitos. Hashing

Transcrição:

Introdução à Computação II 5952011 5. Algoritmos de Ordenação Prof. Renato Tinós Depto. de Computação e Matemática (FFCLRP/USP) 1

Principais Tópicos 5.1. Ordenação por Inserção 5.2. Ordenação por Seleção 5.3. Método da Bolha 5.4. Heapsort 5.5. Quicksort 5.5.1. Algoritmo de Partição 5.5.2. Ordenação por Quicksort 5.6. Considerações sobre o Problema de Ordenação 5.7. Ordenação em Tempo Linear 2

5.5. Quicksort Desenvolvido por C. A. R. Hoare em 1960 É um algoritmo mais rápido que se conhece para diversas categorias de problemas A idéia básica é dividir o problema de ordenação de N registros em dois problemas menores Dividir para conquistar Baseada no fato que as permutações devem ser preferencialmente empregadas para pares de elementos que guardem entre si distâncias grandes, com a finalidade de se conseguir uma maior eficiência 3

5.5. Quicksort Por exemplo, se os N registros estão na ordem inversa de suas chaves, é possível ordená-los com apenas N/2 permutações tomando-se primeiramente os elementos das extremidades à direita e à esquerda e convergindo gradualmente para o centro, pelos dois lados Obviamente, isto é possível se os elementos estiverem exatamente na ordem inversa 4

5.5. Quicksort Exemplo 5.5.1. a 1 2 3 4 5 6 7 8 95 67 56 45 43 19 12 8 8 67 56 45 43 19 12 95 8 12 56 45 43 19 67 95 8 12 19 45 43 56 67 95 8 12 19 43 45 56 67 95 5

5.5. Quicksort Exercício 5.5.1. Escreva um algoritmo para inverter a ordem dos elementos de um vetor de N elementos 6

5.5. Quicksort Exercício 5.5.1. Escreva um algoritmo para inverter a ordem dos elementos de um vetor de N elementos... para i 1 até i N/2 x a[i] a[i] a[n-i+1] a[n-i+1] x fim para... 7

5.5.1. Algoritmo de Partição Algoritmo de partição escolha-se arbitrariamente um elemento x do vetor a o vetor é varrido da esquerda para a direita, até que seja encontrado um elemento a[ i ] > x após isso, o vetor é varrido da direita para a esquerda até que seja encontrado um elemento a[ j ] < x nesta ocasião, os dois elementos serão permutados, e este processo de varredura e de permutação continua até que os dois deslocamentos se encontrem em algum ponto intermediário do vetor O resultado desta prática é um vetor particionado, no qual a partição esquerda contém apenas chaves cujos valores são menores (ou iguais) a x e a partição direita, apenas chaves cujos valores são maiores (ou iguais) a x 8

5.5.1. Algoritmo de Partição Seja x = 43 45 56 12 43 95 8 19 67 45 56 12 43 95 8 19 67 19 56 12 43 95 8 45 67 19 56 12 43 95 8 45 67 19 8 12 43 95 56 45 67 Chaves menores ou iguais a x Chaves maiores ou iguais a x 9

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j )... 10

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) a Exemplo 5.5.2. Partição para x = 43 x = 43 i N = 8 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 j 11

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) a Exemplo 5.5.2. Partição para x = 43 x = 43 i N = 8 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 j 12

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) a Exemplo 5.5.2. Partição para x = 43 x = 43 i N = 8 1 2 3 4 5 6 7 8 8 56 12 43 95 19 45 67 j 13

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) a Exemplo 5.5.2. Partição para x = 43 x = 43 i N = 8 1 2 3 4 5 6 7 8 8 56 12 43 95 19 45 67 j 14

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) a Exemplo 5.5.2. Partição para x = 43 x = 43 i N = 8 1 2 3 4 5 6 7 8 8 19 12 43 95 56 45 67 j 15

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) a Exemplo 5.5.2. Partição para x = 43 x = 43 N = 8 i 1 2 3 4 5 6 7 8 8 19 12 43 95 56 45 67 j 16

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) a Exemplo 5.5.2. Partição para x = 43 x = 43 N = 8 i 1 2 3 4 5 6 7 8 8 19 12 43 95 56 45 67 j 17

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) a Exemplo 5.5.2. Partição para x = 43 x = 43 N = 8 j i 1 2 3 4 5 6 7 8 8 19 12 43 95 56 45 67 18

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) a Exemplo 5.5.2. Partição para x = 43 x = 43 N = 8 j i 1 2 3 4 5 6 7 8 8 19 12 43 95 56 45 67 19

5.5.1. Algoritmo de Partição... i 1 j N x selecionar um elemento aleatoriamente do vetor a faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) a Exemplo 5.5.2. Partição para x = 43 x = 43 N = 8 j 1 2 3 4 5 6 7 8 8 19 12 43 95 56 45 67 i 20

5.5.1. Algoritmo de Partição Exemplo 5.5.2. Particione o vetor abaixo utilizando o algoritmo descrito para x = 45 x = 56 x = 12 x = 95 x = 19 x = 8 x = 67 a 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 21

5.5.1. Algoritmo de Partição Exemplo 5.5.2. Solução x = 45 a 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 8 56 12 43 95 19 45 67 8 19 12 43 95 56 45 67 8 19 12 43 95 56 45 67 22

5.5.1. Algoritmo de Partição Exemplo 5.5.2. Solução x = 56 a 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 45 8 12 43 95 19 56 67 45 8 12 43 19 95 56 67 23

5.5.1. Algoritmo de Partição Exemplo 5.5.2. Solução x = 12 a 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 8 56 12 43 95 19 45 67 8 12 56 43 95 19 45 67 24

5.5.1. Algoritmo de Partição Exemplo 5.5.2. Solução x = 95 a 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 45 56 12 43 67 19 8 95 45 56 12 43 67 19 8 95 25

5.5.1. Algoritmo de Partição Exemplo 5.5.2. Solução x = 19 a 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 8 56 12 43 95 19 45 67 8 19 12 43 95 56 45 67 8 19 12 43 95 56 45 67 26

5.5.1. Algoritmo de Partição Exemplo 5.5.2. Solução x = 8 a 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 8 56 12 43 95 19 45 67 8 56 12 43 95 19 45 67 27

5.5.1. Algoritmo de Partição Exemplo 5.5.2. Solução x = 67 a 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 45 56 12 43 67 19 8 95 45 56 12 43 67 19 8 95 28

5.5.1. Algoritmo de Partição Exemplo 5.5.3. Particione o vetor abaixo utilizando o algoritmo descrito para x = 45 a 1 2 3 4 5 6 7 8 45 45 45 45 45 45 45 45 29

5.5.1. Algoritmo de Partição Exemplo 5.5.3. Solução a 1 2 3 4 5 6 7 8 45 45 45 45 45 45 45 45 45 45 5 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 30

5.5.1. Algoritmo de Partição Este algoritmo é bastante direto e eficiente Entretanto no caso das N chaves idênticas são necessárias N/2 permutações Permutações desnecessárias podem ser eliminadas trocando-se os comandos de varredura para enquanto ( a[ i ] x ) enquanto ( x a[ j ] ) j j -1 Neste caso, o elemento escolhido x, que está presente como elemento do vetor, já funcionará como sentinela para as duas varreduras Entretanto, um vetor que possuísse todas as suas chaves idênticas provocaria uma varredura para além da extensão do vetor, a menos que venham a ser utilizadas condições de término mais complexas A simplicidade das condições empregadas no algoritmo certamente compensam uma permutação extra, que dificilmente ocorre de fato na média dos casos reais de aplicação 31

5.5.2. Ordenação por Quicksort É necessário lembrar que o objetivo almejado não é só o de encontrar partições do vetor original, mas também ordená-lo Entretanto é simples o passo que leva à ordenação a partir do particionamento após ter sido particionado o vetor, aplica-se o mesmo processo para ambas as partições em seguida, para as partições oriundas de cada uma das partições obtidas e assim por diante, até que todas as partições consistam de apenas um único elemento. 32

5.5.2. Ordenação por Quicksort Algoritmo qsort( a[ ], L, R ) i L j R x a [ floor( (L + R ) / 2 ) ] faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) se ( L < j ) qsort( a, L, j ) fim se se ( i < R ) qsort( a, i, R ) fim se Algoritmo quicksort( a[ ], N ) qsort( a, 1, N ) Note que o procedimento qsort utiliza recursão 33

5.5.2. Ordenação por Quicksort Algoritmo qsort( a[ ], L, R ) i L j R x a [ floor( (L + R ) / 2 ) ] faça { enquanto ( a[ i ] < x ) enquanto ( x < a[ j ] ) j j -1 se ( i j ) w a[ i ] a[ i ] a[ j ] a[ j ] w j j - 1 fim se } enquanto ( i j ) se ( L < j ) qsort( a, L, j ) fim se se ( i < R ) qsort( a, i, R ) fim se x=43 x=19 x=8 x=56 x=95 a Algoritmo quicksort( a[ ], N ) qsort( a, 1, N ) L R 1 2 3 4 5 6 7 8 45 56 12 43 95 19 8 67 L R 8 19 12 43 95 56 45 67 L R 8 12 19 43 95 56 45 67 8 12 19 43 95 56 45 67 8 12 19 43 45 56 95 67 8 12 19 43 45 56 67 95 L L R R 34

5.6.2. Ordenação por Quicksort Quick-sort with Hungarian (Küküllőmenti legényes) folk dance https://youtu.be/ywwby6j5gz8?t=2 IMPORTANTE: O ALGORITMO DEMONSTRADO É UMA VARIAÇÃO DO APRESENTADO AQUI 35

5.5.2. Ordenação por Quicksort Admitindo-se que sempre ocorra o melhor caso (o limite escolhido é o ponto médio da partição), então em cada particionamento, o vetor é dividido em duas metades, o que resulta em O(log(N)) divisões, e, assim, a complexidade da ordenação será O(N log(n)) Está complexidade também é válida para o caso médio, já que, em média, as divisões no vetor são equilibradas Quanto ao pior caso, considere, por exemplo, a situação na qual o elemento x de comparação como sendo o maior dos valores de uma partição. Então, em cada passo, um segmento de N elementos será dividido em uma partição esquerda com N-1 elementos e uma partição direita com um único elemento O resultado é que são necessários O(N) (ao invés de O(log(N))) divisões e que o desempenho para o pior caso é O(N 2 ) 36

5.5.2. Ordenação por Quicksort Exercício 5.5.1. Utilizando ordenação pelo método quicksort, obtenha o número de comparações e movimentações em cada passo (i e j) para os seguintes vetores [ 45 56 12 43 95 19 8 67 ] [ 8 12 19 43 45 56 67 95 ] [ 95 67 56 45 43 19 12 8 ] [ 19 12 8 45 43 56 67 95 ] 37

Exercício 5.5.1. Solução 5.5.2. Ordenação por Quicksort i j Ci Mi 45 56 12 43 95 19 8 67 5 3 9 10 8 19 12 43 95 56 45 67 3 2 3 4 8 12 19 43 95 56 45 67 2 0 3 4 8 12 19 43 95 56 45 67 7 5 5 7 8 12 19 43 45 56 95 67 8 7 2 4 8 12 19 43 45 56 67 95 22 29 i j Ci Mi 8 12 19 43 45 56 67 95 5 3 9 4 8 12 19 43 45 56 67 95 3 1 4 4 8 12 19 43 45 56 67 95 7 5 5 4 8 12 19 43 45 56 67 95 8 6 3 4 8 12 19 43 45 56 67 95 21 16 i j Ci Mi 19 12 8 45 43 56 67 95 5 4 8 4 19 12 8 43 45 56 67 95 3 1 5 7 8 12 19 43 45 56 67 95 4 2 3 4 8 12 19 43 45 56 67 95 7 5 5 4 8 12 19 43 45 56 67 95 8 6 3 4 8 12 19 43 45 56 67 95 24 23 i j Ci Mi 95 67 56 45 43 19 12 8 5 4 8 13 8 12 19 43 45 56 67 95 3 1 5 4 8 12 19 43 45 56 67 95 4 2 3 4 8 12 19 43 45 56 67 95 7 5 5 4 8 12 19 43 45 56 67 95 8 6 3 4 8 12 19 43 45 56 67 95 24 29 38

Principais Tópicos 5.1. Ordenação por Inserção 5.2. Ordenação por Seleção 5.3. Método da Bolha 5.4. Heapsort 5.5. Quicksort 5.5.1. Algoritmo de Partição 5.5.2. Ordenação por Quicksort 5.6. Considerações sobre o Problema de Ordenação 39

5.6. Considerações Sobe o Problema de Ordenação Análise dos Algoritmos de Ordenação Considerando os algoritmos de ordenação vistos, a tabela seguinte mostra a ordem de grandeza de números mínimo (C mín ), médio (C med ) e máximo (C max ) de comparações de chaves números mínimo (M mín ), médio (M med ) e máximo (M max ) de movimentos de chaves. Algoritmo C mín C méd C máx M mín M méd M máx Inserção Direta O(N) O(N 2 ) O(N 2 ) O(N) O(N 2 ) O(N 2 ) Inserção Binária O(N*log 2 N) O(N*log 2 N) O(N*log 2 N) O(N) O(N 2 ) O(N 2 ) Seleção Direta O(N 2 ) O(N 2 ) O(N 2 ) O(N) O(N) O(N) Bubblesort O(N 2 ) O(N 2 ) O(N 2 ) O(1) O(N 2 ) O(N 2 ) Shakersort O(N) O(N 2 ) O(N 2 ) O(1) O(N 2 ) O(N 2 ) Heapsort O(N*log 2 N) O(N*log 2 N) O(N*log 2 N) O(N*log 2 N) O(N*log 2 N) O(N*log 2 N) Quicksort O(N*log 2 N) O(N*log 2 N) O(N 2 ) O(N*log 2 N) O(N*log 2 N) O(N 2 ) 40

Comparações Quadro Geral: Comparações 5.6. Considerações Sobe o Problema de Ordenação 40 35 35 45,56,12,43,95,19,8,67 8,12,19,43,45,56,67,95 95,67,56,45,43,19,12,8 19,12,8,45,43,56,67,95 36 35 35 30 28 28 28 28 28 28 28 28 28 27 25 22 23 24 24 23 25 20 15 16 13 17 14 13 14 17 15 11 11 10 7 7 5 0 Inserção Direta Inserção Binária Seleção Direta Borbulhamento Agitação Shellsort Quicksort Heapsort 41

Movimentações Quadro Geral: Movimentações 5.6. Considerações Sobe o Problema de Ordenação 90 80 45,56,12,43,95,19,8,67 8,12,19,43,45,56,67,95 95,67,56,45,43,19,12,8 19,12,8,45,43,56,67,95 84 84 70 60 57 58 58 50 49 42 45 45 52 40 36 37 36 35 38 30 20 21 25 29 14 18 21 21 21 21 12 12 27 30 22 26 10 0 0 0 Inserção Direta Inserção Binária Seleção Direta Borbulhamento Agitação Shellsort Quicksort Heapsort 42

5.6. Considerações Sobe o Problema de Ordenação Análise dos Algoritmos de Ordenação [Ziviani, 2004]: Tempo total real para ordenar arranjos de registros (os valores estão normalizados de acordo com o tempo do método que foi mais rápido) Registros em ordem aleatória 500 5000 10000 30000 Inserção Direta 11,3 87 161 - Seleção 16,2 124 228 - ShellSort 1,2 1,6 1,7 2 Heapsort 1,5 1,6 1,6 1,6 Quicksort 1 1 1 1 Registros em ordem ascendente 500 5000 10000 30000 Inserção Direta 1 1 1 1 Seleção 128 1524 3066 - ShellSort 3,9 6,8 7,3 8,1 Heapsort 12,2 20,8 22,4 24,6 Quicksort 4,1 6,3 6,8 7,1 Registros em ordem descendente 500 5000 10000 30000 Inserção Direta 40,3 305 575 - Seleção 29,3 221 417 - ShellSort 1,5 1,5 1,6 1,6 Heapsort 2,5 2,7 2,7 2,9 Quicksort 1 1 1 1 43

5.6. Considerações Sobe o Problema de Ordenação Análise dos Algoritmos de Ordenação [Ziviani, 2004], páginas 116-118. Inserção Interessante para arquivos com menos de 20 elementos Estável Implementação simples Para arquivos ordenados, é O(n) Seleção Números de movimentação é O(n)» Deve ser usado para arquivos com registros grandes (estruturas com muitos elementos), desde que não exceda 1000 elementos 44

5.6. Considerações Sobe o Problema de Ordenação Análise dos Algoritmos de Ordenação [Ziviani, 2004], páginas 116-118. Quicksort É o algoritmo mais eficiente para uma grande variedade de situações É recursivo» Utiliza memória adicional Entretanto, seu desempenho no pior caso é O (n 2 ) 45

5.6. Considerações Sobe o Problema de Ordenação Análise dos Algoritmos de Ordenação [Ziviani, 2004], páginas 116-118. Heapsort Método eficiente, mas cerca de duas vezes mais lento que o Quicksort No entanto, não utiliza memória adicional Tempo proporcional a n log n, qualquer que seja a ordem inicial dos elementos» Aplicações que devem ser executadas em tempo praticamente igual podem utilizar Heapsort 46

5.6. Considerações Sobe o Problema de Ordenação Com que Velocidade podemos ordenar para o caso geral? Qualquer algoritmo de ordenação baseado em comparações pode ser visto como uma árvore de decisão, onde os nós internos representam uma comparação de chaves as arestas indicam o resultado do teste (verdadeiro ou falso) e os nós folhas (terminais) representam o resultado final do processo de ordenação 47

5.6. Considerações Sobe o Problema de Ordenação Árvore de Decisão (3 elementos) a[1] <= a[2] Sim a[1],a[2],a[3] Não a[2] <= a[3] a[1],a[2],a[3] a[1] <= a[3] a[2],a[1],a[3] Sim Não Sim Não a[1],a[3],a[2] a[2],a[3],a[1] a[1],a[2],a[3] a[1] <= a[3] a[2],a[1],a[3] a[2] <= a[3] Sim Não Sim Não a[1],a[3],a[2] a[3],a[1],a[2] a[2],a[3],a[1] a[3],a[2],a[1] 48

5.6. Considerações Sobe o Problema de Ordenação Com que velocidade podemos ordenar para o caso geral? Ordenando N elementos: N! resultados possíveis A árvore deve ter N! folhas Como uma árvore binária de altura h tem, no máximo, 2 h folhas, sabemos que N! 2 h h log 2 (N!) Portanto qualquer árvore de decisões que classifica N elementos distintos tem uma altura mínima log 2 (N!) Sabendo que (pois pelo menos N/2 termos do produto são maiores que N/2) N! = N(N-1)(N-2)...(2)(1) (N/2) N/2 Então log 2 (N!) (N/2)log 2 (N/2) = O(N log 2 N) Ou seja, a melhor complexidade possível, para o caso geral (i.e., para qualquer tipo de chave e com qualquer distribuição de ocorrências) é O( N log 2 N ) 49