Algoritmos de Ordenação Prof. Frederico Brito Fernandes [email protected] CONTEÚDO (1) Auto-avaliação (2) Ordenação de Dados (3) Ordenação por troca: bubble sort (1) Auto-avaliação Ordenação/Classificação • Antes de prosseguir: – Faça o acompanhamento das variáveis, conforme explicado na aula passada, para realiazar uma pesquisa binária buscando as chaves: • 5 • 12 vet inicio 0 1 2 3 4 1 3 4 5 9 fim meio vet[i] vet[i+1] chave – Implemente o algoritmo de buscaBinária de forma recursiva, e faça o acompanhamento novamente Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 2 (2) Ordenação Ordenação/Classificação • Temos basicamente duas formas de realizar ordenação: – ou inserimos os elementos na estrutura de dados respeitando a ordenação (dizemos que a ordenação é garantida por construção); – ou a partir de um conjunto de dados já criado, aplicamos um algoritmo para ordenar seus elementos. Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 3 (3) Ordenação por troca Ordenação Bolha (Bubble Sort) • A idéia fundamental é fazer uma série de comparações entre os elementos do vetor. • Pares de elementos do vetor são comparados dois a dois (e eventualmente trocados) até o final do vetor. • Quando dois elementos estão fora de ordem, esses dois elementos são trocados de posição, ficando em ordem correta. • O processo é repetido até que nenhuma troca seja feita. Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 7 4 1 9 2 4 7 1 9 2 1 7 4 9 2 1 4 7 9 2 1 2 7 9 4 1 2 4 9 7 1 2 4 7 9 4 (3) Ordenação por troca Pseudocódigo Algorithm Bubble_Sort(X, n) Input array X of n integers Output array X sorted in a non-decreasing order for i 0 to n 1 do for j i+1 to n-1 do if (X[i]>X[j]) then s X[i]; X[i] X[j]; X[j] s; O(n2) return X // after i-th round, the i-th smallest number is at i-th position. Estrutura, Pesquisa e Ordenação de Dados Frederico Brito Fernandes 5 (3) Ordenação por troca Código em C (outra versão do bubble sort) #include <stdio.h> #define MAX 10 void troca(int i, int j, int v[]){ int aux= v[i]; v[i]=v[j]; v[j]=aux; } void bubbleSort(int v[], int n){ int i=0; while (i<n-1){ if (v[i]>v[i+1]){ troca(i,i+1,v); i=0; } else i++; } } void imprimeVetor(int v[], int n){ for (int i=0;i<n;i++) printf(" %3d",v[i]); } Estrutura, Pesquisa e Ordenação de Dados void bubbleSortRecursivo(int v[], int n){ int trocou=0, i=0; while (i<n-1){ if (v[i]>v[i+1]){ troca(i,i+1,v); trocou=1; } i++; } if (trocou==1) bubbleRecursivo(v, n); } main(){ int qtde=MAX; int vet[MAX] = {1,5,7,2,8,3,6,12,4,10}; printf("\nVetor Original:\n"); imprimeVetor(vet,qtde); bubbleSort(vet,qtde); //bubbleSortRecursivo(vet,qtde); printf("\nVetor Ordenado:\n"); imprimeVetor(vet,qtde); } Frederico Brito Fernandes 6