Método de ordenação - objetivos: Corresponde ao processo de rearranjar um conjunto de objetos em uma ordem ascendente ou descendente. Facilitar a recuperação posterior de itens do conjunto ordenado. São largamente utilizados em Sistemas Gerenciadores de Banco de Dados (SGBDs). Em alguns casos é necessário fazer a avaliação da ordenação no melhor, médio e pior caso.
Método de ordenação Bolha (Bouble sort) Método mais conhecido; Ordenação por trocas (compara o elemento da bolha com o próximo elemento); Troca de valores entre posições consecutivas; Ordenação sequencial (percorre o vetor e compara elemento a elemento, mesmo que tal elemento ou todos já estejam ordenados) d Recomendado, portanto, para vetores com poucos elementos.
Método de ordenação Bolha (Bouble sort) A ordenação bolha é feita através de dois laços. O laço mais externo, da variável cont1, determina qual elemento do vetor será usado como base de comparação (a bolha ). O laço mais interno, da variável cont2, compara cada item com o elemento base do primeiro laço e, quando encontrar um item menor que o de base, faz a troca. O processo de troca usa uma variável temporária (temp) para guardar o valor do menor valor, inicialmente; depois, põe na posição que antes era ocupada pelo item do laço mais interno, o valor do item de base; finalmente, atribui o valor armazenado na variável temporária (o menor valor) ao elemento base. A troca esta concluída.
Método de ordenação Bolha (Bouble sort) Ex: Ordenar os elementos de um vetor vet, com 3 posições, respectivamente 12,8 e 3. Passo 1: fixar a bolha no primeiro i elemento do vetor vet: 0 1 2 12 8 3 vet[0] vet[1] vet[2]
Método de ordenação Bolha (Bouble sort) Passo 2: comparar o elemento da bolha com o próximo elemento se for maior, faz a troca, seguindo os passos: A) O menor elemento é armazenado na variável temporária (temp = vet[1], ou seja, temp guadará 8) B) O Maior elemento é copiado na posição que antes era ocupado pelo menor elemento (vet[1] = vet[0]) 12 12 3 vet[0] vet[1] vet[2] C) O valor do menor elemento (variável temp) é copiado na posição que antes era ocupada pelo maior elemento (vet[0]=temp). 8 12 3 vet[0] vet[1] vet[2]
Método de ordenação Bolha (Bouble sort) Passo 3: Repete-se o todos os procedimentos do passo 2, agora comparando a bolha com o último elemento: A) O menor elemento é armazenado na variável temporária (temp = vet[2], ou seja, temp guadará 3) B) O Maior elemento é copiado na posição que antes era ocupado pelo menor elemento (vet[2] = vet[0]) 8 12 3 vet[0] vet[1] vet[2] C) O valor do menor elemento (variável temp) é copiado na posição que antes era ocupada pelo maior elemento (vet[0]=temp). 3 12 8 vet[0] vet[1] vet[2]
Método de ordenação Bolha (Bouble sort) Passo 4: Passo a bolha para o próximo elemento e repito os passos 1 e 2: Repetição passo 2: A) temp = vet[2] B) vet[2] = vet[1] C) vet[1] = temp (fim) 3 12 8 vet[0] vet[1] vet[2] 3 12 12 vet[0] vet[1] vet[2] 3 8 12 vet[0] vet[1] vet[2]
Método de ordenação Bolha (Bouble sort) Código fonte (C ANSI): #include <conio.h> #include <stdio.h> int main(void){ int vet[3]={12,8,3; //armazendo dados no vetor vet int temp; //variável que armazenará menor elemento getch(); printf("vetor antes da ordenacao:\n\n"); \ for(int cont1=0;cont1<=2;cont1++){ //exibindo os dados originais printf("%d\t", vet[cont1]); //****** Método de ordenação Bouble Sort ******** for(int cont1=0;cont1<=1;cont1++){ //laço da bolha for(int cont2=cont1+1;cont2<=2;cont2++){ //laço de comparação if(vet[cont1]>vet[cont2]){ t1] t2]){ //compara bolha com próximo elemento temp = vet[cont2]; // temp guarda menor elemento da comparação vet[cont2]=vet[cont1]; // copia maior elemento para proxima posicao vet[cont1]=temp; t1] t // menor elemento vai para a posição menor printf("\n\n\nvetor depois da ordenacao:\n\n"); for(int cont1=0;cont1<=2;cont1++){ // exibe vetor ordenado printf("%d\t", vet[cont1]);
Método de Ordenação Shell (Shell Sort) O algoritmo de ordenação por shel foi criado por Donald L. Shell em 1959. Ele tem algumas similaridades com o algoritmo anterior. Neste algoritmo, ao invés dos dados serem comparados com os seus vizinhos, é criado um gap. O gap, no início, é igual à parte inteira da divisão do número de elementos da lista por 2. Por exemplo, se a nossa lista tem 15 elementos, o gap inicial é igual a 7. São então comparados os elementos 1o. e 8o., 2o. e 9o., e assim por diante. O que acontece, então? A maior parte dos elementos já vão para suas posições aproximadas. O 15, por exemplo, já é mandado para o fim da lista na primeira passagem, ao contrário do que acontece na ordenção de troca. Ao terminar de passar por todos os elementos da lista, o gap é diminuído em 1 e é feita uma nova passagem. Isso é repetido até que o gap seja igual a 0. Programa à seguir.
Método de Ordenação Shell (Shell Sort) Código-fonte (C ANSI): //ordenacao shell sort #include <conio.h> #include <stdio.h> int main (void){ int comp=0, troca=0, gap=0, temp=0, cont1=0, cont2=0, cont3=0; int vet[20]; int tamanhovetor = sizeof(vet)/sizeof(*vet); int i, j, incremento; for(cont1=0;cont1<tamanhovetor;cont1++){ printf("digite o %do. elemento do vetor ",cont1+1); 1); scanf("%d",&vet[cont1]); printf("\n\nos dados do vetor digitados foram:\n\n"); for(cont1=0;cont1<tamanhovetor;cont1++){ printf("%d\t",vet[cont1]); gap = tamanhovetor/2; while (gap > 0){ for (cont1=0; cont1 < tamanhovetor; cont1++){ cont2 = cont1; temp = vet[cont1]; while ((cont2 >= gap) && (vet[cont2-gap] > temp)){ vet[cont2] = vet[cont2 - gap]; cont2 = cont2 - gap; vet[cont2] = temp; if (gap/2!= 0) gap = gap/2; else if (gap == 1) gap = 0; else gap = 1; printf("\n\nos dados do vetor ordenados foram:\n\n"); for(cont1=0;cont1<tamanhovetor;cont1++){ printf("%d\t",vet[cont1]); printf("\n\nfinal de programa - pressione ENTER para sair"); getch (); //Pausa para a execução do programa//
Método de Ordenação Quick Sort Considerado um dos melhores métodos de ordenação. Visa particionar o vetor, ordenando as porções menores do vetor, separadamente. Método de divisão e conquista. Funciona da seguinte maneira: Seleciona-se um valor x para ser o pivô (o valor da posição do meio do vetor); Divide o vetor com os valores menores ou iguais a x, e a segunda parte com os valores maiores.
Método de Ordenação Quick Sort Exemplo para o primeiro particionamento: D C H F E A I B G divide o vetor no meio D C H F E A I B G permuta H com B D C B F E A I H G permuta F com A D C B A E F I H G vetor dividido em duas partições. Segue permutando e dividindo...
Método de Ordenação Quick Sort Código-fonte (C ANSI): void troca(int x[], int i, int j){ //função de troca int temp; temp = x[i]; x[i] = x[j]; x[j] = temp; int random(int min, int max){ //localiza elemento aleatorio no vetor return (int)((max - min) * rand()/(float)rand_max + min); void QuickSort(int x[], int limiteinferior, int limitesuperior){ int i, m; if(limiteinferior >= limitesuperior){ //indica que estou fora da particao atual return; //retorno vazio (null) troca(x, limiteinferior, random(limiteinferior, limitesuperior)); //faz a troca do elemento maior pelo menor m = limiteinferior; for(i=limiteinferior+1; i<=limitesuperior; i++){ if(x[i] < x[limiteinferior]){ //faz a troca do proximo elemento da partição troca(x, ++m, i); troca(x, limiteinferior, m); QuickSort(x, limiteinferior, it i m-1); //particiona i e ordena elementos da partição anterior à atual QuickSort(x, m+1, limitesuperior); //particiona e ordena elementos da proxima particao à atual int main (void){ int x[50]; int tamanhovetor = sizeof(x)/sizeof(*x); //determina o tamanho do vetor for(int i=0;i<tamanhovetor;i++){ //preenchendo o vetor x[i] = rand() % 500; //gera numeros aleatórios, de 0 a 500 e os armazena nas posicoes do vetor for(int i=0;i<tamanhovetor;i++){ //exibe vetor atual printf("%d\t", x[i] [] ); QuickSort(x, 0,tamanhoVetor-1); //passa os elementos do vetor, o tamenho incial e tamanho final-1 (ex: 0 a 9,para um vetor de 10 posicoes) printf("\n"); ") for(int i=0;i<tamanhovetor;i++){ //exibe vetor ordenado printf("%d\t", x[i] ); getch();
Método de Busca Sequencial C (fazer...).
Imagine uma lista telefônica: João 3582-4045 Paulo 3532-4352 Pedro 3594-2412 André 3343-5324 Fernando 3324-4235 Maria 3241-4353 Sônia 3425-2412 Rafael 3243-2534 Tiago 3435-3421 Zenobio 3212-2119 Se quisermos buscar um nome qualquer dentro desta lista, temos que percorrer toda a lista, ou pelo menos o necessário até encontrarmos o nome procurado. Mas se tivermos a lista ordenada por ordem alfabética, fica muito mais fácil: é só irmos para a letra que queremos, e logo encontraremos o telefone desejado.
Porém, em uma lista mais longa, mesmo estando a mesma ordenada, d a busca manual (item a item) levaria muito tempo, gerando baixa produtividade para o usuário. É nesse contexto que surgem os métodos de busca, deixando a cargo do sistema computacional a tarefa de procurar o dado desejado. Existem dois tipos básicos de busca: A busca manual e a busca binária.
Método de Busca Sequencial A pesquisa seqüencial utiliza o método mais básico de pesquisa de dados: vai pesquisando os dados, um a um, até que encontre o dado buscado. Esse tipo de pesquisa é útil caso a lista de busca esteja desordenada, mas caso a lista esteja em ordem, seu rendimento é bastante baixo. O número de dados pesquisados, neste caso, é igual à posição dos dados. Por exemplo, para que se encontre um dados que está na 10ª posição, é necessário que se façam 10 buscas. À seguir, a implementação do método de busca sequencial, aplicado ao exemplo da lista telefônica.
Método de Busca Sequencial Código-fonte (C ANSI): #include <iostream> #include <conio.h> #include <stdio.h> //cria a estrutura chamada listatel struct listatel { char nome[60]; char telefone[15]; ; int main(void){ //referencia um alias para a estrutura struct listatel agendatel[10]; char nome_pesq[60]; int achou; for(int cont=0;cont<=9;cont++){ printf("digite o nome da %da. pessoa: ",cont+1); fflush(stdin); gets(agendatel[cont].nome); printf("digite o telefone: "); fflush(stdin); gets(agendatel[cont].telefone); printf("\n\nos dados presentes na lista telefonica sao:\n"); //realizando a pesquisa sequencial printf("\n\ndigite o nome a ser pesquisado: "); fflush(stdin); gets(nome_pesq); achou=0; //inicializa a flag achou como falso for(int cont=0;cont<=9;cont++){ if(strcmp(strupr(agendatel[cont].nome), strupr(nome_pesq))==0){ achou=1; //modifica a flag, indicando que foi encontrado o valor pesquisado printf("\n%s\t\t%s - posicao %d\n",agendatel[cont].nome, agendatel[cont].telefone, cont+1); if(achou==0){ //indica que nao foi encontrada nenhuma ocorrencia para a pesquisa printf("\n\nnao foi encontrado nenhuma ocorrencia para %s\n",nome_pesq); getch(); //exibindo os dados dos registros printf("#\tnome\t\ttelefone\n"); \t\tt f \ ") for(int cont=0;cont<=9;cont++){ printf("%d\t%s\t", cont+1, agendatel[cont].nome); printf("%s\n",agendatel[cont].telefone);
Método de Busca Binária A busca binária é um método mais avançado de busca, que faz o seguinte caminho: a primeira busca é feita no meio da lista. Caso o dado buscado seja maior que o dado central da lista, a nova pesquisa será feita somente da metade para a frente da lista. Caso contrário, da metade para trás. É claro que se o dado central for o buscado, a pesquisa termina por aí. IMPORTANTE!!! A busca binária só ocorre de forma eficiente i se os dados d estiverem devidamente ordenados d De forma padrão, apenas uma única ocorrência é encontrada. Ex: se tivermos duas pessoas com o mesmo nome, ele encontra apenas uma delas.
Método de Busca Binária Código-fonte (C ANSI): Ver o código fonte busca_binaria.cpp
1. Implemente o método de pesquisa sequencial para pesquisar dados do tipo real e ordene os números, através do método de ordenação Shell sort. Ao final, o usuário terá direito de pesquisar novo dado. 2. Implemente o método de pesquisa binária para pesquisar dados do tipo real e ordene os números, através do método de ordenação Quick sort. Ao final, o usuário terá direito it de pesquisar novo dado. 3. Utilize o método de ordenação Bouble sort para ordenar 10 números quaisquer em ordem decrescente. 4. Implemente o método Bouble sort para ordenar um vetor de 5 elementos do tipo string. Dica: utilize a função strcmp() para comparar os elementos e strupr() para deixá-los todos em maiusculo (vide exemplos neste material).
5. Utilize o método de ordenação Quick sort para odenar 10 números quaisquer em ordem decrescente. esce 6. Implemente o método Shell sort para ordenar um vetor de 5 elementos do tipo string. Dica: utilize a função strcmp() para comparar os elementos e strupr() para deixa-los todos em maiusculo (vide exemplos neste material). 7. (Desafio 1)Faça um estudo comparativo dos métodos de ordenação Bouble sort, Shell sort e Quick sort, para ordenar um vetor de 100 elementos inteiros, criado aleatoriamente, através de função randômica do C. Dica: crie duas variáveis. Uma que contará quantas iterações são feitas dentro de cada método de ordenação e outra que contará quantas trocas foram feitas. Ao final, exiba a primeira variável, que indicará a comparação e a segunda, que indicará a quantidade de trocas efetuadas. Ao final do estudo, esboce a comparação através de um gráfico de barras, feito em qualquer programa (ex: Excel) 8. (Desafio 2) Descubra qual o grau de complexidade dos 3 métodos de ordenação e faça um estudo comparativo desses graus, indicando qual deles é o mais complexo
UNIDADE II Métodos de Ordenação e Busca FIM