ALGORITMOS E ESTRUTURAS DE DADOS III                                    Tutorial 8 (usa o compilador de linguagem C Dev-C+...
2 O ALGORITMO DE ORDENAÇÃO1 INTRODUÇÃO                                                      HEAPSORTEsta série de tutoriai...
2.3 HEAPSORT                                             Caso Médio                                                       ...
3 DESENVOLVA                                         4. Desenvolver os algoritmos “Inserção”, “sele-                      ...
Upcoming SlideShare
Loading in …5
×

Tutorial aed iii 008 - algoritmo de ordenação heapsort

2,264 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,264
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
73
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Tutorial aed iii 008 - algoritmo de ordenação heapsort

  1. 1. ALGORITMOS E ESTRUTURAS DE DADOS III Tutorial 8 (usa o compilador de linguagem C Dev-C++ versão 4.9.9.2)Parte 2 de 3 sobre o algoritmo de ordenação heap (monte) conhecido como Heapsort.
  2. 2. 2 O ALGORITMO DE ORDENAÇÃO1 INTRODUÇÃO HEAPSORTEsta série de tutoriais sobre Algoritmos e Estrutu-ras de Dados III foi escrita usando o MicrosoftWindows 7 Ultimate, Microsoft Office 2010, 2.1 REFAZBloodshed Dev-C++ versão 4.9.9.2 (pode ser bai- Refaz o heap.xado em http://www.bloodshed.net), referênciasna internet e notas de aula do professor quando void refaz(int esq, int dir, int A[]) {estudante. Ela cobre desde os algoritmos de or- int i, j, x;denação, passando pela pesquisa em memóriaprimária e culminando com a pesquisa em me- i = esq;mória secundária. j = 2 * i; x = A[i];Nós entendemos que você já conhece o compila-dor Dev-C++. No caso de você ainda não o conhe- while(j <= dir) {cer, dê uma olhada nos tutoriais Dev-C++ 001 a if(j < dir)017, começando pelo Tutorial Dev-C++ - 001 - if(A[j] < A[j + 1]) j++;Introdução. if(x >= A[j]) goto 999; A[i] = A[j];Se não tem problemas com a linguagem C/C++ e i = j;o compilador Dev-C++, então o próximo passo é j = 2 * i;saber ler, criar e alterar arquivos em disco usan- }do linguagem C/C++. Se ainda não sabe comofazê-lo, dê uma olhada nos tutoriais Dev-C++ 001 999: A[i] = x;e 002, começando pelo Tutorial Dev-C++ 001 –Criação, Leitura e Alteração de Arquivos. 2.2 CONSTROISe sabe todas as coisas anteriores, então a pró- Constrói o heap.xima etapa é conhecer os algoritmos mais básicosde ordenação. Em minhas notas de aula você void constroi(int n, int A[]) {encontra um material básico, porém detalhado e int esq;com algoritmos resolvidos, dos principais méto-dos de ordenação existentes. esq = n / 2; while(esq > 0) {Adotaremos o livro Projeto de Algoritmos com esq--;Implementação em Pascal e C, Editora Cengage refaz(esq, n, A);Learning, de Nivio Ziviani, como livro-texto da }disciplina. Nele você encontrará os métodos deordenação que iremos estudar. Usando o heap obtido pelo procedimento cons- trói, pega o elemento na posição 1 do vetor (raizSeu próximo passo será estudar os algoritmos de do heap) e troca com o item que está na posiçãoordenação por Inserção, Seleção, Shellsort e n do vetor. Agora usando o procedimento refazQuicksort. Você pode usar os links anteriores para reorganizar o heap para os itens A[1], A[2],(em inglês) ou fazer uso do livro-texto. ..., A[n-1]. Repete-se as duas operações sucessi- vamente até que reste apenas um item.Em seguida, você precisa conhecer o algoritmoHeapsort. Para isto, você pode seguir o TutorialAED 007, desta série, e/ou ler o capítulo referen-te no livro-texto.Se você estiver lendo este tutorial tenha certezade ter seguido o Tutorial AED 007. Agora quevocê seguiu todos os passos até aqui, está prontopara prosseguir com este tutorial.
  3. 3. 2.3 HEAPSORT Caso Médio Como nenhum algoritmo de ordenação pode ser void heapsort (int n, int A[]) { inferior a O(n log n) e C(n) e M(n) são O(n log n), int esq, dir; decorre que C(n) = O(n log n) e M(n) = O(n log n). esq = n / 2; 2.2 MELHORIAS E IMPLEMENTAÇÕES dir = n - 1; while(esq > 1) { 2.2.1 MELHORIAS esq--; Um algoritmo de ordenação cai na família orde- refaz(esq, dir, A); nação adaptativa, se tira vantagem da ordena- } ção existente em sua entrada. Ele se beneficia do pré-ordenamento na sequência de entrada - ou while(dir > 1) { uma quantidade limitada de desordem para as x = A[1]; diversas definições de medidas de desordem - e A[1] = A[dir]; A[dir] = x; dir--; ordenação mais rapidamente. A ordenação adap- refaz(esq, dir, A); tativa é normalmente realizada modificando-se os } algoritmos de ordenação existentes. } 2.2.1.1 H EAPSORT A DAPTATIVO O Heapsort adaptativo é um algoritmo de ordena- 2.1 COMPLEXIDADE DO HEAP- ção que é semelhante ao Heapsort, mas usa um SORT árvore de busca binária aleatória para a estrutu- ra da entrada de acordo com uma ordem preexis- Pior caso tente. A árvore de busca binária aleatória é usada Analisando cada parte do algoritmo: para selecionar os candidatos que são colocados algoritmo refaz no heap, de modo que o heap não precisa se manter a par de todos os elementos. O Heapsort  se a árvore binária com n nós possui altura k, adaptativo é parte da família de algoritmos de k é o menor inteiro que satisfaz ordenação adaptativos. n ≤ 2k+1 – 1 e 2k ≤ n ≤ 2k+1 – 1, logo k = log n  o procedimento atua entre os níveis o e (k-1) O primeiro Heapsort adaptativo foi o Smoothsort da subárvore, efetuando, em cada nível, no de Dijkstra. máximo duas comparações e uma troca. Por- tanto, 2.2.1.1.1 S MOOTHSORT Algoritmo de ordenação relativamente simples. É = C(n) = 2k ≤ 2 log n ⇒ C(n) = O(log n) um algoritmo de ordenação por comparação. T(n) = k ≤ log n ⇒ M(n) = 3T(n) ≤ 3 log n ⇒ M(n) = O(log n) Smoothsort (método) é um algoritmo de ordena- ção por comparação. É uma variação do Heapsort algoritmo constrói desenvolvido por Edsger Dijkstra em 1981. Como  o algoritmo executa o algoritmo refaz (n div 2) o Heapsort, o limite superior do Smoothsort é de vezes, portanto, O(n log n). A vantagem de Smoothsort é que ele C(n) ≤ (n/2) 2 log n = n log n ⇒ O(n log n) se aproxima de tempo O(n) se a entrada já tem T(n) ≤ (n/2) log n ⇒ M(n) = 3T(n) ≤ 3n/2 log n algum grau de ordenação, enquanto a média do = O(n log n) Heapsort é de O(n log n), independentemente do estado inicial em termos de ordenação. algoritmo heapsort Para uma análise completa sobre o algoritmo  a ordenação da estrutura heap requer a exe- Smoothsort, leia o excelente artigo O Algoritmo cução do refaz (n-1) vezes, portanto, de Ordenação Smoothsort Explicado, Cadernos C(n) ≤ (n-1) 2 log n ⇒ C(n) = O(n log n) do IME – Série Informática, volume 28, página T(n) ≤ (n-1) log n ⇒ M(n) = 3T(n) ≤ 3 (n-1) log n 23. = O(n log n)  portanto, no pior caso: M(n) = O(n log n)2
  4. 4. 3 DESENVOLVA 4. Desenvolver os algoritmos “Inserção”, “sele- ção”, “Shellsort”, “Quicksort” e “Heapsort” em Tente criar algoritmos de ordenação heapsort linguagem C. Usar um registro com três cam- genéricos (que ordenem ascendente ou descen- pos: Código (numérico), Nome (string), Ende- dente e por qualquer chave fornecida) para os reço (string). A ordenação deve ser pelo códi- problemas a seguir. go. Os outros dados podem ser preenchidos aleatoriamente. 1. Ordenação de inteiros; Executar os programas com listas contendo 2. Ordenação de strings; 100, 200 e 400 elementos na seguinte situa- 3. Ordenação de strings a partir de um dado ção inicial: caractere, por exemplo, a partir do 3º caracte- a) Lista inicial aleatória; re; b) Lista inicial ascendente; 4. Ordenação de Estruturas por um campo es- c) Lista inicial descendente. colhido; Os valores devem ser atribuídos no próprio 5. Ordenação de estruturas por uma chave programa fonte ou lidos uma única vez no composta escolhida; início da execução. Calcular o tempo gasto em cada execução. 4 EXERCÍCIOS PROPOSTOS Colocar um contador para calcular o número 1. Crie um programa que faça uma comparação de comparações executadas. Ao final de cada entre todos os métodos de ordenação estuda- execução imprimir o contador. Ao final das dos em aula com relação a estabilidade (pre- execuções, fazer uma tabela e comparar os servar ordem lexicográfica), ordem de com- resultados encontrados. plexidade levando em consideração compara- No lugar do contador, colocar um delay. Cal- ções e movimentações para um vetor de 100 cular o tempo gasto. Ao final das execuções, inteiros contendo os 100 primeiros números fazer uma tabela e comparar os resultados naturais em ordem decrescente. encontrados. Fazer um documento texto analisando os da- 2. Escreva um programa para ordenar os 200 dos encontrados. Deve apresentar as tabelas primeiros números da lista de 100000 núme- com os dados encontrados e os valores espe- ros inteiros fornecida no blog, primeiro usan- rados, quando possível. O que se pode con- do o pivot como o primeiro elemento, depois cluir observando os dados encontrados nos usando o pivot como o elemento central, de- itens anteriores e a teoria apresentada? Apre- pois usando um pivot escolhido aleatoriamen- sente uma comparação com a complexidade te e por fim, um pivot usando a mediana en- apresentada. tre três o primeiro, o último e elemento cen- tral dos valores. 5 TERMINAMOS Terminamos por aqui. 3. Escreva um programa que leia compromissos para uma agenda, anotando o assunto, a da- Corra para o próximo tutorial. 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.3

×