Método de ordenação - objetivos:



Documentos relacionados
Departamento de Engenharia Rural Centro de Ciências Agrárias. Programação I

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

ALGORITMOS DE ORDENAÇÃO

Métodos de Ordenação

INF 1010 Estruturas de Dados Avançadas

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI2

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Programação II. Busca em Vetor (search) Bruno Feijó Dept. de Informática, PUC-Rio

Existem duas categorias de algoritmos de ordenação: Os algoritmos de ordenação são avaliados de acordo com os seguintes critérios:

BUSCA EM ARRAYS. Prof. André Backes. Ato de procurar por um elemento em um conjunto de dados

INF 1007 Programação II

O Problema da Ordenação Métodos de Ordenação Parte 1

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Métodos de Ordenação Parte I

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TURMA 2008/1 2 PERÍODO MÓDULO 3 AVALIAÇÃO MP2 DATA 2/10/2008 ESTRUTURAS DE DADOS 2008/2

Listas (Parte 2) Túlio Toffolo BCC202 Aula 10 Algoritmos e Estruturas de Dados I

Lista Ordenada. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

Programação de Computadores II. Cap. 17 Busca

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

Métodos de ordenação. Bubble sort:

Linguagem C: Ordenação

DAINF - Departamento de Informática

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA

Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1

Estruturas de Dados Aula 15: Árvores 17/05/2011

UNIVERSIDADE DA BEIRA INTERIOR

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

INF111 Programação II Aulas 11, 12, 13 Ordenação

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Universidade Federal de Rondônia Técnicas de Desenvolvimento de Programas Lista 4

Projeto e Análise de Algoritmos

heapsort (int *x, int n) { int i, e, s, f, aux; /*fase de pré-processamento - cria heap inicial*/ for (i=1; i<n; i++) { e = x[i]; s = i; f = (s-1)/2;

LISTA DE EXERCÍCIOS - ro. 04

Limite assintótico para a ordenação, Ordenação em tempo linear

UNIVERSIDADE DO TOCANTINS TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS PRÁTICA EM PROGRAMAÇÃO DE SISTEMAS

Listas Encadeadas. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

ALGORITMOS DE ORDENAÇÃO RECURSIVOS

Aula 18 Algoritmos básicos de busca e classificação

Os métodos de ordenação que ordenam os elementos in situ podem ser classificados em três principais categorias:

Introdução Métodos de Busca Parte 1

Pesquisa Linear. Adriano J. Holanda 15/3/2016

INF 1007 Programação II

Programação: Vetores

Métodos Computacionais. Strings (Vetor de Caracteres)

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

Análise e Complexidade de Algoritmos

BCC202 - Estrutura de Dados I

Aula 15: Pesquisa em Memória Primária. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Pesquisa e Ordenação

INF1007: Programação 2 7 Busca em Vetores. 01/04/2014 (c) Dept. Informática - PUC-Rio 1

Algoritmos de Ordenação

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Listas Lineares. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1

INF 1620 P3-02/07/02 Questão 1 Nome:

ESTRUTURA DE DADOS LISTAS LINEARES

INF 1620 P2-14/10/05 Questão 1 Nome:

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

Transcrição:

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