Professional Documents
Culture Documents
RESOLUO DE ATIVIDADE
So Lus MA
2014
ATIVIDADE
1) Modifique o algoritmo Quicksort de forma a ele utilizar um outro mtodo de
ordenao simples para quando as colees ficarem menores (preferencialmente
insero).
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MaxTam 1000000
#define MaxRand 1000
#define Max 10000
//Quando as colees so menores o Quick Sort utiliza um outro
mtodo de ordenao simples
void imprimir_lista();
typedef struct {
int chave;
}TItem;
TItem lista[MaxTam];
void iniciar_lista(){
// Inicializar o gerador de nmeros aleatrios Com time(NULL)
srand(time(NULL));
int i;
for (i = 0; i < MaxTam; i++){
lista[i].chave = rand() % MaxRand;
}
}
void preencher_lista()
{
int i;
j = r + 1;
while(i < j)
{
do
{
j = j - 1;
}while(lista[j].chave > pivo.chave);
do
{
i = i + 1;
}while(lista[i].chave < pivo.chave);
if (i < j)
troca(i,j);
}
return j;
}
void quicksort(int p,int r)
{
int q;
if(p < r)
{
q = particao(p,r);
quicksort(p,q);
quicksort(q+1,r);
}
if((r-p) < Max)
InsertionSort(r-p+1);
return;
}
void imprimir_lista(){
Selection Sort
Este algoritmo baseado em se passar sempre o menor valor do vetor para a
primeira posio (ou o maior dependendo da ordem requerida), depois o segundo menor
valor para a segunda posio e assim sucessivamente, at os ltimos dois elementos.
Neste algoritmo de ordenao escolhido um nmero a partir do primeiro, este
nmero escolhido comparado com os nmeros a partir da sua direita, quando
encontrado um nmero menor, o nmero escolhido ocupa a posio do menor nmero
encontrado. Este nmero encontrado ser o prximo nmero escolhido, caso no for
encontrado nenhum nmero menor que este escolhido, ele colocado na posio do
primeiro nmero escolhido, e o prximo nmero sua direita vai ser o escolhido para
fazer as comparaes. repetido esse processo at que a lista esteja ordenada.
Neste passo o primeiro nmero escolhido foi o 3, ele foi comparado com todos
os nmeros sua direita e o menor nmero encontrado foi o 1, ento os dois
trocam de lugar.
No foi encontrado nenhum nmero menor que 3, ento ele fica na mesma
posio.
O nmero 5 foi escolhido novamente e o nico nmero menor que ele sua
direita o 4, ento eles trocam.
Vetor j ordenado.
Insertion sort
O Insertion sort um algoritmo simples e eficiente quando aplicado em
pequenas listas. Neste algoritmo a lista percorrida da esquerda para a direita, medida
que avana vai deixando os elementos mais esquerda ordenados.
O algoritmo funciona da mesma forma que as pessoas usam para ordenar cartas
em um jogo de baralho como o pquer.
Quick sort
O Quicksort o algoritmo mais eficiente na ordenao por comparao. Nele
se escolhe um elemento chamado de piv, a partir disto organizada a lista para que
todos os nmeros anteriores a ele sejam menores que ele, e todos os nmeros
posteriores a ele sejam maiores que ele. Ao final desse processo o nmero piv j est
em sua posio final. Os dois grupos desordenados recursivamente sofreram o mesmo
processo at que a lista esteja ordenada.
O nmero 3 foi escolhido como piv, nesse passo procurado sua direita um
nmero menor que ele para ser passado para a sua esquerda. O primeiro nmero
menor encontrado foi o 1, ento eles trocam de lugar.
Agora procurado um nmero sua esquerda que seja maior que ele, o primeiro
nmero maior encontrado foi o 5, portanto eles trocam de lugar.
O vetor desse exemplo um vetor pequeno, portanto ele j foi ordenado, mas se
fosse um vetor grande, ele seria dividido e recursivamente aconteceria o mesmo
processo de escolha de um piv e comparaes.
}
for(i=0;i<au;i++)
{
v[i+ini1]=aux[i];}
}
void mergeSort (int v[], int aux[],int esq, int dir)
{
int meio,i;
if(esq<dir)
{
meio=(esq+dir)/2;
mergeSort(v,aux,esq,meio);
mergeSort(v,aux,meio+1,dir);
intercalar(v,aux,esq,meio+1,dir);
}
}
int main()
{
int v[9]={53,25,46,32,23,37,41,17,10},aux[9],i;
mergeSort(v,aux,0,8);
for(i=0;i<9;i++)
{
printf("%d\t",v[i]);
}
return 0;
}
A ideia bsica do Merge Sort criar uma sequncia ordenada a partir de duas
outras tambm ordenadas. Para isso, o algoritmo Merge Sort divide a sequncia original
em pares de dados, agrupa estes pares na ordem desejada; depois as agrupa as
sequncias de pares j ordenados, formando uma nova sequncia ordenada de quatro
elementos, e assim por diante, at ter toda a sequncia ordenada.
Algoritmo:
Os trs passos teis dos algoritmos dividir-para-conquistar, que se aplicam ao Merge
Sort so:
1. Dividir: Dividir os dados em subsequncias pequenas; Este passo realizado
recursivamente, iniciando com a diviso do vetor de n elementos em duas
metades, cada uma das metades novamente dividida em duas novas metades e
assim por diante, at que no seja mais possvel a diviso (ou seja, sobrem n
vetores com um elemento cada).
2. Conquistar: Classificar as duas metades recursivamente aplicando o merge sort;
3. Combinar: Juntar as duas metades em um nico conjunto j classificado.
Para completar a ordenao do vetor original de n elementos, faz-se o merge ou
a fuso dos sub-vetores j ordenados.
A desvantagem do Merge Sort que requer o dobro de memria, ou seja,
precisa de um vetor com as mesmas dimenses do vetor que est sendo classificado.
Na figura abaixo temos um Vetor original com elemento desordenado.
0
53
25
46
32
23
37
41
17
10
53
25
46
32
23
37
41
17
10
53
25
46
32
23
37
41
17
10
53
53
25
25
46
46
32
32
23
23
37
37
41
41
17
17
10
10
Aps todo o processo de diviso, ocorre o processo da fuso ordenada dos subvetores.
O subvetor (53) com o subvetor (25). Ordenando os dois.
0
25
53
46
32
23
37
41
17
10
25
46
53
32
23
37
41
17
10
25
46
53
23
32
37
41
17
10
23
25
32
46
53
37
41
17
10
23
23
23
25
25
25
32
32
32
46
46
46
53
53
53
37
37
10
41
41
17
17
10
37
10
17
41
Os subvetores resultantes (23,25, 32, 36,53) e (10, 17, 37, 41) so fundidos ordenados
durante a fuso.
0
10
17
23
25
32
37
41
46
53