Transcript
Page 1: Métodos de Ordenação Ordenação em memória primária

Métodos de Ordenação

Ordenação em memória primária

Page 2: 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:

Page 3: Métodos de Ordenação Ordenação em memória primária

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...

Page 4: Métodos de Ordenação Ordenação em memória primária

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}

Page 5: Métodos de Ordenação Ordenação em memória primária

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.

Page 6: Métodos de Ordenação Ordenação em memória primária

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}

Page 7: Métodos de Ordenação Ordenação em memória primária

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.

Page 8: Métodos de Ordenação Ordenação em memória primária

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}

Page 9: Métodos de Ordenação Ordenação em memória primária

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);

}

Page 10: Métodos de Ordenação Ordenação em memória primária

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)));

Page 11: Métodos de Ordenação Ordenação em memória primária

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.


Recommended