110 likes | 207 Views
Métodos de Ordenação. Ordenação em memória primária. Dado um vetor de tamanho n, com índices de 0 a n-1, onde cada posição possui uma chave de ordenação
E N D
Métodos de Ordenação Ordenação em memória primária
Dado um vetor de tamanho n, com índices de 0 a n-1, onde cada posição possui uma chave de ordenação Um algoritmo de ordenação deve rearranjar o vetor de forma a estabeler uma ordem entre os elementos onde, para quaisquer elementos vi-1, vi vi-1 < vi , i = 1..n-1, considerando a chave de ordenação. Objetivos Vetor desordenado V de tamanho n = 5 Ordena(V,n) Vetor ordenado:
Método da Seleção (Selection Sort) • Descrição:Seleciona sempre o menor elemento remanescente do conjunto não ordenado e move este elemento para sua posição correta • Algoritmo • Encontrar o menor elemento e trocar com o elemento na primeira posição do vetor • Encontrar o segundo menor elemento e trocar com o elemento na segunda posição do vetor e assim sucessivamente...
algoritmo seleção (int a[], int n){ Para i da primeira posição até a penúltima faca mínimo = i para j da posição seguinte a i até a ultima posição faça se (a[j] < a[mínimo] minimo =j; fim para fim para troca(a[mínimo],a[i]); fim algoritmo Exemplo: {7,3,2,10,1} Para i =0, mínimo terminará com o valor 4, e o 1 será trocado com o 7 {1,3,2,10,7} i=1, mínimo terminará com o valor 2, e o 2 será trocado com o 3 {1,2,3,10,7} i= 2, mínimo terminará com o valor 4, e não haverá troca i=3, mínimo terminará com o valor 4, e o 7 será trocado com o 10 {1,2,3,7,10} Método da Seleção
Método da Inserção • Descrição: Considera cada elemento uma vez inserindo-o em seu lugar correto entre os elementos que já estão em ordem. (Usado para ordenar cartas de um baralho na mão do jogador.) • Algoritmo: • O elemento é inserido entre os ordenados movendo-se os elementos maiores que ele uma posição para a direita e posteriormente inserindo-o na posição vaga.
Algoritmo insercao(int A[], int n) para j do segundo elemento até o último faça x = A[j]; i=j-1; enquanto (i >= 0 e A[i] > x) faça A[i+1]=A[i]; i = i-1; fim enquanto A[i+1]=x; fim para fim algoritmo Exemplo: {7,3,2,10,1} Para j = 1, o 7 é “empurrado” uma posição e o 3 é colocado na posição (i+1) = 0 {3,7,2,10,1} Para j =2, { 3,7} são empurrados uma posição e o 2 é colocado na posição 0 {2,3,7,10,1} Para j=3, ninguém é empurrado e o 10 é colocado na mesma posição onde estava {2,3,7,10,1} Para j =4, {2,3,7,10} são empurrados uma posição e o 1 é inserido na posição 0: {1,2,3,7,10} Método da Inserção (Insertion sort)
Método da bolha (bouble sort) • Descrição: Consiste em percorrer o vetor trocando os elementos adjacentes caso necessário. • O maior elemento vai “subir” (como um bolha) para a última posição do vetor.
algoritmo bolha ( int a[],int n) Para i do ultimo elemento até o segundo faça para j do segundo elemento até i faça se (a[j-1]>a[j]) troca(&a[j-1],&a[j]); } Exemplo Método da Bolha
Exercício • Implementar os métodos inserção, seleção e bolha em C e fazer uma avaliação de desempenho dos mesmos Usar a função abaixo para gerar vetores aleatórios: #include <math.h> geravetor(int a[], int N){ int i; srand(time(NULL)); for (i=0;i<N;i++) a[i]= (rand()%N); }
Exercícios Usar a função ftime para medir o tempo. Exemplo: #include<sys/timeb.h> struct timeb ini, fim; ftime(&ini); // obtem o tempo no inicio Ordena(v,n); ftime(&fim); // obtem o tempo no final // Computa o tempo gasto e imprime printf("tempo gasto na ordenacao: %f segundos \n", ((double) fim.time + ((double) fim.millitm * 0.001)) - ((double) ini.time + ((double) ini.millitm * 0.001)));
Exercícios • a) Realizar testes com vetores de tamanho 20000, 40000, 60000, 80000, 100000, 150000, 200000, 250000, 300000, 350000, 400000 e 500000. Utilize um software de planilha para traçar gráficos que permitam visualizar e comporar o desempenho dos métodos.