26
Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Embed Size (px)

Citation preview

Page 1: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Ordenação de Dados

em Memória

BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello

INE5384 - Estruturas de DadosUFSC-CTC-INE

Page 2: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Ordenação de Dados

• Processo bastante utilizado na computação de uma estrutura de dados

• Dados ordenados garantem uma melhor performance de pesquisa a uma ED

– busca seqüencial• evita a varredura completa de uma lista de dados

– busca binária• só é possível se os dados estão ordenados• apresenta baixa complexidade

Page 3: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Compromisso• “A complexidade da ordenação da ED

não deve exceder a complexidade da computação a ser feita na ED sem o processo de ordenação”

• Exemplo: deseja-se realizar uma única pesquisa a um vetor– busca seqüencial O(n)– ordenação O(n log n)– Não vale a pena ordenar!

Page 4: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Considerações

• Dados estão mantidos em um vetor

• Elemento do vetor– objeto que possui um atributo chave que deve

ser mantido ordenado

• Um método troca(x,y) realiza a troca dos elementos presentes nas posições x e y do vetor

• Para fins de exemplo, números inteiros serão utilizados como elementos

Page 5: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Métodos de Ordenação

• Ordenação por troca– BubbleSort (método da bolha)– QuickSort (método da troca e partição)

• Ordenação por inserção– InsertionSort (método da inserção direta)– BinaryInsertionSort (método da inserção direta binária)

• Ordenação por seleção– SelectionSort (método da seleção direta)– HeapSort (método da seleção em árvore)

• Outros métodos– MergeSort (método da intercalação)– BucketSort (método da distribuição de chave)

Page 6: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Métodos de Ordenação Simples

• São três– BubbleSort– InsertionSort– SelectionSort

• Características– fácil implementação– alta complexidade– comparações ocorrem sempre entre posições

adjacentes do vetor

Page 7: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

“Revisão” de Somatória

• Propriedade 1 (P1)

• Propriedade 2 (P2)

i = 1

n n (n + 1)i =

2

i = 1

n

i =k i = 1

n

ik

Page 8: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

SelectionSort

• SelectionSort é um método simples de seleção

– ordena através de sucessivas seleções do elemento de menor valor em um segmento não-ordenado e seu posicionamento no final de um segmento ordenado

e2 e5 e8 . . . e6

e2 e5 e6 . . . e8

troca

Page 10: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Seleção - Complexidade• Para qualquer caso

9 5 1 2 4

1 5 9 2 4

1 2 9 5 4

1 2 4 5 9

1a V: n-1 comparações

2a V: n-2 comparações

. . .(n-1)a V: 1 comparação

i = 1

n - 1i (n - 1) n=

2 O(n2)

troca

Page 11: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Seleção - Implementação void Ordenação_por_Seleção(tipo vet[], int qtpos){

int fim, i, posmaior;tipo aux;fim=qtpos -1; /* inic todo vetor está desordenado */while (fim>0) /* qdo fim=0,a parte desord tem1 elem , logo, está ordenado*/{

posmaior=Escolhe_maior (vet,fim);if (posmaior!= fim) /* se o maior já está na ultpos da parte desord. nada

há a fazer */{

aux=vet[fim];vet[fim]=vet[posmaior];vet[posmaior]=aux,

}fim - -;

}}}

Page 12: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Seleção - Implementação

int Escolhe_maior(tipo v[], int upt){ /* Acessa cada posição da parte desordenada do vetor,procurando

onde está maior valor*/

int pM,i;pM=0;for(i=1;i<=up;i++){

if (v[i]>v[pM])pM=i;

}return ( pM)}

Page 13: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Bolha

• BubbleSort é um método simples de troca– ordena através de sucessivas trocas entre

pares de elementos do vetor

• Características– realiza varreduras no vetor, trocando pares

adjacentes de elementos sempre que o próximo elemento for menor que o anterior

– após uma varredura, o maior elemento está corretamente posicionado no vetor e não precisa mais ser comparado• após a i-ésima varredura, os i maiores elementos

estão ordenados

Page 15: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Bolha - Complexidade• Para um vetor de n elementos, n – 1

varreduras são feitas para acertar todos os elementos

4 9 2 1 5n = 5

4 2 1 5 9

2 1 4 5 9

1 2 4 5 9

1 2 4 5 9

início:

1 2 4 5 9

1a V: n – 1 comparações

2a V: n – 2 comparações. . .

(n-2)a V: 2 comparações

(n-1)a V: 1 comparação

fim:

Page 16: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Bolha - Complexidade

• Definida pelo número de comparações envolvendo a quantidade de dados do vetor

• Número de comparações:

(n - 1) + (n – 2) + ... + 2 + 1

• Complexidade (para qualquer caso):

i = 1

n - 1

i (n - 1) n=2

O(n2)

Page 17: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Bolha - Implementação void Bolha(tipo vet[], int qtpos){

int ultroca,fimdesord,ultroca;tipo aux;for(fimdesord=qtpos-1;fimdesord>0;fimdesord=ultroca) {

ultroca=0;for(i=0;i<fimdesord;i++) /* ult. pos. que tem vizinho à direita é a penúltima*/{

if(vet[i]>vet[i+1]){

aux=vet[i];vet[i]=vet[i+1];vet[i+1]=aux;ultroca=i; /* guarda onde realizou a última troca pois a

parte antecessora a esta posição no vetor pode ter ficado desordenada */

}}

}

Page 18: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Ordenação por Inserção

• InsertionSort é um método simples de inserção

• Características do método de inserção– considera dois segmentos (sub-vetores) no

vetor: ordenado (aumenta) e não-ordenado (diminui)

– ordena através da inserção de um elemento por vez (primeiro elemento) do segmento não-ordenado no segmento ordenado, na sua posição correta

Page 19: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Método de Inserção

e5 e9 . . . e8 e2

segmento ordenado segmento não-ordenado

e5 e8 e9 . . . e2

• Inicialmente, o segmento ordenado contém apenas o primeiro elemento do vetor

Page 20: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

InsertionSort • realiza uma busca seqüencial no segmento

ordenado para inserir corretamente um elemento do segmento não-ordenado

• nesta busca, realiza trocas entre elementos adjacentes para ir acertando a posição do elemento a ser inserido

e5 e9 e8 . . . e2

e5 e8 e9 . . . e2

Page 22: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

InsertionSort - Complexidade• Pior caso: vetor totalmente desordenado

9 5 4 2 1n = 5

5 9 4 2 1

4 5 9 2 1

2 4 5 9 1

1 2 4 5 9

início:

1a V: 1 comparação

2a V: 2 comparações. . .

(n-2)a V: n-2 comparações

(n-1)a V: n-1 comparações

i = 1

n - 1

i (n - 1) n=2

O(n2)

Page 23: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

InsertionSort - Complexidade• Melhor caso: vetor já ordenado

1 2 4 5 9n = 5

1 2 4 5 9

1 2 4 5 9

1 2 4 5 9

1 2 4 5 9

início:

1a V: 1 comparação

2a V: 1 comparação. . .

(n-2)a V: 1 comparação

(n-1)a V: 1 comparação

n - 1 O(n)

Page 24: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

InsertionSort X BubbleSort

Melhor caso Pior caso

InsertionSort O(n) O(n2)

BubbleSort O(n2) O(n2)

Page 25: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Comparação

Melhor caso Pior caso

InsertionSort O(n) O(n2)

BubbleSort O(n2) O(n2)

SelectionSort O(n2) O(n2)

Page 26: Ordenação de Dados em Memória BASEADO NA APRESENTAÇÃO DE Prof. Ronaldo S. Mello INE5384 - Estruturas de Dados UFSC-CTC-INE

Exercícios• Faça um programa que gerencie uma agenda de telefones. O programa deve ser

capaz de armazenar as informações para até 100 pessoas. A agenda deve conter o nome e o telefone de cada pessoa, devendo ser possível realizar as seguintes operações: consulta de um telefone, inclusão de um novo telefone; alteração do número de um telefone já cadastrado; exclusão de um telefone; impressão dos telefones cadastrados; ordenação por nome; consulta a partir do nome de uma pessoa; armazenamento dos dados em um arquivo(escreve_tudo) e recuperação dos dados do arquivo (le_tudo). A rotina de consulta de um telefone obtido o nome, quando o mesmo não está cadastrado deve perguntar ao usuário se o mesmo deve ser incluído.

• a)      faça uma função chamada le_tudo() que pergunta o nome do arquivo que contém a agenda. Se o mesmo existir, leia as informações do arquivo. A função retorna a quantidade de registros lidos. Se o arquivo não existe, a função retorna 0 (zero). O nome perguntado deve ser mantido

• b)      faça uma função chamada escreve_tudo() que escreva tudo no arquivo cujo nome é o mesmo da rotina de leitura..

• c)      faça uma função para cada tarefa que o programa realiza.• • Obs;O programa deverá avisar ao usuário sempre que não puder realizar as

alterações. Faça cada tarefa e teste- Comece pela le_tudo, a seguir faça a inclusão e a escreve_tudo.

• Não se esqueça de fazer a função main().