• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Tutorial aed iii   008 - algoritmo de ordenação heapsort
 

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

on

  • 1,668 views

 

Statistics

Views

Total Views
1,668
Views on SlideShare
1,668
Embed Views
0

Actions

Likes
0
Downloads
51
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • 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 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.
    • 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
    • 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