Upload
internet
View
174
Download
27
Embed Size (px)
Citation preview
Métodos de Ordenação
Ordenação em memória primária
Objetivos
• 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.
0 1 2 3 4
7 3 2 10 1
0 1 2 3 4
1 2 3 7 10
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
• Algoritmo1. Encontrar o menor elemento e trocar com o elemento na primeira
posição do vetor
2. Encontrar o segundo menor elemento e trocar com o elemento na segunda posição do vetor e assim sucessivamente...
Método da Seleção
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á trocai=3, mínimo terminará com o valor 4, e
o 7 será trocado com o 10{1,2,3,7,10}
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: 1. 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.
Método da Inserção (Insertion sort)
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 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.
Método da Bolha
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
i j A={7,3,2,10,1}4 1 {3,7,2,10,1}
2 {3,2,7,10,1}
3 {3,2,7,10,1}
4 {3,2,7,1,10}
3 1 {2,3,7,1,10}
2 {2,3,7,1,10}
3 {2,3,1,7,10}
2 1 {2,3,1,7,10}
2 {2,1,3,7,10}
1 1 {1,2,3,7,10}
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.