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

Weitere ähnliche Inhalte

Was ist angesagt?

Tutorial aed iii 004 - algoritmo de ordenação quicksort
Tutorial aed iii   004 - algoritmo de ordenação quicksortTutorial aed iii   004 - algoritmo de ordenação quicksort
Tutorial aed iii 004 - algoritmo de ordenação quicksortFlávio Freitas
 
Tutorial aed iii 006 - algoritmo de ordenação quicksort
Tutorial aed iii   006 - algoritmo de ordenação quicksortTutorial aed iii   006 - algoritmo de ordenação quicksort
Tutorial aed iii 006 - algoritmo de ordenação quicksortFlávio Freitas
 
Tutorial aed iii 005 - algoritmo de ordenação quicksort
Tutorial aed iii   005 - algoritmo de ordenação quicksortTutorial aed iii   005 - algoritmo de ordenação quicksort
Tutorial aed iii 005 - algoritmo de ordenação quicksortFlávio Freitas
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeRegis Magalhães
 
Complexidade de algoritmos insertion, selection e bubble sort.
Complexidade de algoritmos insertion, selection e bubble sort.Complexidade de algoritmos insertion, selection e bubble sort.
Complexidade de algoritmos insertion, selection e bubble sort.Júlio Rocha
 
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Universidade de São Paulo
 
Análise assintótica
Análise assintóticaAnálise assintótica
Análise assintóticaPablo Silva
 
Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05thomasdacosta
 
Análise da complexidade de algoritmos
Análise da complexidade de algoritmosAnálise da complexidade de algoritmos
Análise da complexidade de algoritmosPablo Silva
 
Aula 06 vetores e matrizes
Aula 06   vetores e matrizesAula 06   vetores e matrizes
Aula 06 vetores e matrizesTácito Graça
 
Programação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma MáximaProgramação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma MáximaGabriel Albuquerque
 
Algoritmos e Programação: Manipulação de strings
Algoritmos e Programação: Manipulação de stringsAlgoritmos e Programação: Manipulação de strings
Algoritmos e Programação: Manipulação de stringsAlex Camargo
 
Trabalho métodos de ordenação
Trabalho métodos de ordenaçãoTrabalho métodos de ordenação
Trabalho métodos de ordenaçãoDaiana de Ávila
 
Comparação Experimental de Algoritmos de Ordenação
Comparação Experimental de Algoritmos de OrdenaçãoComparação Experimental de Algoritmos de Ordenação
Comparação Experimental de Algoritmos de OrdenaçãoLenon Fachiano
 
Análise empírica de algoritmos de ordenação
Análise empírica de algoritmos de ordenaçãoAnálise empírica de algoritmos de ordenação
Análise empírica de algoritmos de ordenaçãoOrlando Junior
 

Was ist angesagt? (20)

Tutorial aed iii 004 - algoritmo de ordenação quicksort
Tutorial aed iii   004 - algoritmo de ordenação quicksortTutorial aed iii   004 - algoritmo de ordenação quicksort
Tutorial aed iii 004 - algoritmo de ordenação quicksort
 
Algoritmo Shell Sort
Algoritmo Shell SortAlgoritmo Shell Sort
Algoritmo Shell Sort
 
Tutorial aed iii 006 - algoritmo de ordenação quicksort
Tutorial aed iii   006 - algoritmo de ordenação quicksortTutorial aed iii   006 - algoritmo de ordenação quicksort
Tutorial aed iii 006 - algoritmo de ordenação quicksort
 
Tutorial aed iii 005 - algoritmo de ordenação quicksort
Tutorial aed iii   005 - algoritmo de ordenação quicksortTutorial aed iii   005 - algoritmo de ordenação quicksort
Tutorial aed iii 005 - algoritmo de ordenação quicksort
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
 
Estrutura de dados em Java - Recursividade
Estrutura de dados em Java - RecursividadeEstrutura de dados em Java - Recursividade
Estrutura de dados em Java - Recursividade
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Complexidade de algoritmos insertion, selection e bubble sort.
Complexidade de algoritmos insertion, selection e bubble sort.Complexidade de algoritmos insertion, selection e bubble sort.
Complexidade de algoritmos insertion, selection e bubble sort.
 
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
 
Shell sort
Shell sortShell sort
Shell sort
 
Análise assintótica
Análise assintóticaAnálise assintótica
Análise assintótica
 
Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05
 
Análise da complexidade de algoritmos
Análise da complexidade de algoritmosAnálise da complexidade de algoritmos
Análise da complexidade de algoritmos
 
Aula 06 vetores e matrizes
Aula 06   vetores e matrizesAula 06   vetores e matrizes
Aula 06 vetores e matrizes
 
Programação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma MáximaProgramação Dinâmica - Segmento de Soma Máxima
Programação Dinâmica - Segmento de Soma Máxima
 
Algoritmos e Programação: Manipulação de strings
Algoritmos e Programação: Manipulação de stringsAlgoritmos e Programação: Manipulação de strings
Algoritmos e Programação: Manipulação de strings
 
Trabalho métodos de ordenação
Trabalho métodos de ordenaçãoTrabalho métodos de ordenação
Trabalho métodos de ordenação
 
Comparação Experimental de Algoritmos de Ordenação
Comparação Experimental de Algoritmos de OrdenaçãoComparação Experimental de Algoritmos de Ordenação
Comparação Experimental de Algoritmos de Ordenação
 
Análise empírica de algoritmos de ordenação
Análise empírica de algoritmos de ordenaçãoAnálise empírica de algoritmos de ordenação
Análise empírica de algoritmos de ordenação
 

Ähnlich wie Heapsort em C (20)

Aula2
Aula2Aula2
Aula2
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Usando o winplot
Usando o winplotUsando o winplot
Usando o winplot
 
Algoritmo
AlgoritmoAlgoritmo
Algoritmo
 
Lógica de Programação - Unimep/Pronatec - Aula03
Lógica de Programação - Unimep/Pronatec - Aula03Lógica de Programação - Unimep/Pronatec - Aula03
Lógica de Programação - Unimep/Pronatec - Aula03
 
4. metodos de contrucao de algoritmo
4. metodos de contrucao de algoritmo4. metodos de contrucao de algoritmo
4. metodos de contrucao de algoritmo
 
Introdução a programação
Introdução a programaçãoIntrodução a programação
Introdução a programação
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
Math
MathMath
Math
 
Aula 01
Aula 01Aula 01
Aula 01
 
13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmos
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
 
Python
PythonPython
Python
 
OpenMP Day 2
OpenMP Day 2OpenMP Day 2
OpenMP Day 2
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
 
Haskell
HaskellHaskell
Haskell
 
Código Limpo
Código LimpoCódigo Limpo
Código Limpo
 
Algoritmos - Aula 02 - Construcao de algoritmos
Algoritmos - Aula 02 - Construcao de algoritmosAlgoritmos - Aula 02 - Construcao de algoritmos
Algoritmos - Aula 02 - Construcao de algoritmos
 

Heapsort em C

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