You are on page 1of 4

Faculdade de Computao Estruturas e Bancos de Dados 8a.

Aula Prtica: Mtodos de Ordenao (Bolha e Quicksort)

O mtodo da Bolha (bubblesort) um algoritmo de ordenao simples. Realiza pelo menos n comparaes para ordenar n elementos. Ele um dos mais simples algoritmos de ordenao conhecidos, porm considerado ineficiente na ordenao de um conjunto muito extenso de itens. O mtodo da Bolha pode ser resumido em: 1. Comparar dois elementos adjacentes: se o primeiro maior do que o segundo, ambos so trocados. 2. Realizar a comparao/troca definida no item 1 para todos os pares de elementos adjacentes, comeando com os dois primeiros e terminando com os dois ltimos. Neste ponto o ltimo elemento o maior. 3. Repetir o passo 2 para todos os elementos, com exceo do ltimo sucessivamente. A figura a seguir ilustra os 3 passos:

Considerando vetores, podemos ter a implementao do mtodo da Bolha em linguagem C:


void bubbleSort(int v[], int tam) { int i, j; for(i = tam - 1; i > 0; i--) for(j = 0; j < i; j++) if(v[j] > v[j+1]) /* compara elementos adjacentes */ { int temp; temp = v[j]; /* troca elementos em v[j] e v[j+1] */ v[j] = v[j+1]; v[j+1] = temp; } }

Exerccios Prticos: 1) Testar a funo bubbleSort definida acima. Faa um programa que receba os dados do vetor e depois os ordena utilizando o mtodo da Bolha (por flutuao) 2) Crie um vetor de milhares de elementos usando uma funo de gerao aleatria de elementos. Verifique o tempo gasto pela funo de ordenao por Bolha para classificar os elementos. // exemplo de gerao aleatria usando a funo rand printf("Insira a quantidade de elementos a serem gerados\n"); scanf("%d",&num); i = 0; while (i <= num -1){ v[i] = rand(); i++; } 3) Escrever um cdigo em linguagem C para implementar o algoritmo bubbleSort para uma lista ligada de objetos do tipo Pessoa, ordenando crescentemente de acordo com a data de nascimento de cada pessoa representada. Grave a lista ordenada num arquivo texto (.txt)

QuickSort O QuickSort baseado em uma estratgia de dividir para conquistar e um dos algoritmos de ordenao mais populares, realizando a ordenao atravs de trocas.. O algoritmo QuickSort pode ser dividido nos seguintes passos: O vetor A[p..r] subdividido em dois vetore A[p..q] e A[q+1..r] no vazios tal que cada elemento de A[p..q] menor ou igual a cada elemento de A[q+1..r]. O ndice q calculado como parte deste particionamento. Os dois subvetores A[p..q] e A[q+1..r] so ordenados por recursivas chamadas do QuickSort.

Por exemplo, dado o vetor f e d h a c g b, e tomando o valor d para partio, o primeiro passo do quicksort rearranja os elementos da seguinte forma: Incio: passo 1: fedhacgb bcadhegf

Esse processo ento repetido para cada seo isto , b c a e h e g f.

O algoritmo Quicksort, inventado por C.A.R. Hoare [Computer Journal, 5, pp.10-15, 1962], em geral bastante rpido. O algoritmo consome tempo proporcional a n log(n) em mdia e proporcional a n2 no pior caso. A funo qsort inclusa na biblioteca <stdio.h> rearranja o vetor base[0..tam-1] em ordem crescente. (O endereo do primeiro elemento do vetor base e o vetor tem tam elementos.) A natureza dos elementos do vetor no importa, mas qsort precisa saber que cada elemento ocupa size bytes. Eis o prottipo da funo: void qsort (void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

O cdigo abaixo ilustra uma utilizao da funo Qsort (biblioteca <stdlib.h>) void imprimeV(int v[], int tam){ int p; for(p=0; p<tam; p++){ printf(" %d",v[p]); } } int cmp (const void *x, const void *y) { return (*(int *)x - *(int *)y); } int main() { int v[100]; int num; int i=0; //l = inicia(); printf("Insira a quantidade de elementos (at 1000)\n"); scanf("%d",&num); while (i < num){

v[i] = rand(); i++; } printf("\nElementos do Vetor : \n"); imprimeV(v, num); qsort (v, num+1, sizeof (int), cmp); printf("\nElementos Ordenados : \n"); imprimeV(v,num); system("PAUSE>>null"); return 0;

Exerccios Prticos: 1) Familiarizar-se com a funo qsort. Testar e finalizar o programa exemplo. 2) Comentar e testar a funo qs que seleciona o valor intermedirio para particionar o vetor (elemento pivot). Para uma ordenao tima, deveria ser selecionado o valor que estivesse precisamente no centro da faixa de valores. Porm, isso no fcil para a maioria do conjunto de dados

void qs(int *A, int left, int right) { register int i, j; int x,y; i=left; j=right; x=A[(left+right)/2];

// Elemento intermedirio como pivot //

do{ while(A[i]<x && i<right) i++; while(A[j]>x && j>left) j--; if(i<=j){ troca(A,i,j); i++; j--; } }while(i<=j); if(left<j) qs(A,left,j); if(i<right) qs(A,i,right); } //-------------------------------------------------

3) Crie um vetor de milhares de elementos usando uma funo de gerao aleatria de elementos. Verifique o tempo gasto pela funo de ordenao Quicksort para classificar os elementos e compare o resultado com o mtodo da Bolha.

You might also like