57
Instituto Superior Técnico, Dep. de Engenharia Mecânica - ACCAII Algoritmos de ordenação e de procura Ordenação Ordenação por selecção Ordenação por inserção linear Ordenação rápida A função sort Exemplos: Ordenar vectores de estruturas Ordenar strings Ordenar índices Procura Procura sequencial Procura binária A função find

Algoritmos de ordenação e de procura - Técnico … Pedro Silva –José Borges Computação e Programação 2009 / 2010 Algoritmos de ordenação 2 •Ordenação é o processo

Embed Size (px)

Citation preview

Instituto Superior Técnico,

Dep. de Engenharia Mecânica - ACCAII

Algoritmos de ordenaçãoe de procura

• Ordenação

• Ordenação por selecção

• Ordenação por inserção linear

• Ordenação rápida

• A função sort

• Exemplos:

• Ordenar vectores de estruturas

• Ordenar strings

• Ordenar índices

• Procura

• Procura sequencial

• Procura binária

• A função find

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Algoritmos de ordenação

2

• Ordenação é o processo de colocar uma lista em

ordem ascendente ou ordem descendente.

• Existem vários algoritmos de ordenação:

• Ordenação por selecção;

• Ordenação por inserção linear;

• Ordenação rápida;

• Etc ….

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 3

Ordenação por selecção

• Algoritmo (ordem crescente):

1. Procurar na lista o elemento mais pequeno, e colocá-lo naprimeira posição da lista, trocando-o de posição com o primeiro elemento da lista;

2. Procurar, a partir do segundo elemento da lista, o elemento mais pequeno, e colocá-lo na segunda posiçãoda lista, trocando-o de posição com o segundo elementoda lista;

3. Continuar o processo até o penúltimo elemento estarcolocado na posição correcta.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 4

Ordenação por selecção

• Percorre várias vezes a lista ou parte da lista

• Em cada passagem, selecciona um item a ser correctamenteposicionado na lista

• Procura o elemento mais pequeno

• Troca-o com o primeiro elemento

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 5

Ordenação por selecção

• Repete para o resto da lista – as sublistas vão sendo sucessivamente mais pequenas

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 6

Ordenação por selecção: implementação

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Ordenação por selecção: execução

7

>> lista=[67,33,21,84,49,50,75]

lista =

67 33 21 84 49 50 75

>> lista_ord=mysort(lista)

lista_ord =

21 33 49 50 67 75 84

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função sort

8

Descrição: Ordena por ordem ascendente (por omissão) ou por ordem descendente.

Sintaxe :

Y = SORT(X,DIM,MODE)

has two optional parameters.

DIM selects a dimension along which to sort.

MODE selects the direction of the sort

'ascend' results in ascending order

'descend' results in descending order

The result is in Y which has the same shape and

type as X.

[Y,I] = SORT(X,DIM,MODE) also returns an index

matrix I.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função sort: exemplos

9

>> lista

lista =

67 33 21 84 49 50 75

>> [lista_ord,indices]=sort(lista)

lista_ord =

21 33 49 50 67 75 84

indices =

3 2 5 6 1 7 4

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função sort: exemplos

10

>> matriz = [4 6 2;8 3 7;9 7 1]

matriz =

4 6 2

8 3 7

9 7 1

>> matriz_ord_col = sort(matriz)

matriz_ord_col =

4 3 1

8 6 2

9 7 7

>> matriz_ord_lin = sort(matriz,2)

matriz_ord_lin =

2 4 6

3 7 8

1 7 9

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função sort: ordenação de strings: exemplos

11

>> words=char('Hello','Howdy','Hi','Goodbye','Ciao')

words =

Hello

Howdy

Hi

Goodbye

Ciao

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função sort: ordenação de strings: exemplos

12

>> sort(words)

ans =

Ce

Giad

Hildb

Hoolo

Howoyye

>> sort(words,2)

ans =

Hello

Hdowy

Hi

Gbdeooy

Caio

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função sortrows

13

Descrição: Ordena cada linha como um bloco (ou grupo), e por ordem ascendente .

Sintaxe : [Y,I] = SORTROWS(X)

Exemplo:

>> sortrows(words)

ans =

Ciao

Goodbye

Hello

Hi

Howdy

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função sort: ordenação de cell de strings

14

>> cellNomesEng={'Quimica','Mecanica','Electrotecnia','Civil'}

cellNomesEng =

'Quimica' 'Mecanica' 'Electrotecnia' 'Civil'

>> sort(cellNomesEng)

ans =

'Civil' 'Electrotecnia' 'Mecanica' 'Quimica'

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função sort: ordenação de cell de strings

15

>> cellNomesEng={'naval','Quimica','Mecanica','Electrotecnia','Civil'}

cellNomesEng =

'naval' 'Quimica' 'Mecanica' 'Electrotecnia' 'Civil'

>> sort(cellNomesEng)

ans =

'Civil' 'Electrotecnia' 'Mecanica' 'Quimica' 'naval'

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Ordenação por selecção: ordenar vectores de estruturas

16

Exemplo:

Escreva uma função que receba um array de estruturas e uma string que designa um campo numérico e que retorne o arrayde estruturas ordenado por ordem crescente, relativamente ao campo pedido.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Ordenação por selecção: ordenar vectores de estruturas

17

% Este script auxiliar cria uma array de estruturas

OsMeusCDs(1) = struct('Genero','Rock', ...

'Artista','Xutos e Pontapés', ...

'Titulo','Circo de Feras', ...

'Ano', 1987);

OsMeusCDs(2) = struct('Genero','Rock', ...

'Artista','Metallica', ...

'Titulo','Black Album', ...

'Ano', 1991);

OsMeusCDs(3) = struct('Genero','Cubana', ...

'Artista','Eliades Ochoa', ...

'Titulo','Grandes Éxitos', ...

'Ano', 2000);

OsMeusCDs(4) = struct('Genero','Rock progressivo', ...

'Artista','Marillion', ...

'Titulo','Misplaced Childhood', ...

'Ano', 1985);

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Ordenação por selecção: ordenar vectores de estruturas

18

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Ordenação por selecção: ordenar vectores de estruturas

19

>> cria_array_estrut;

>> outv = ordena_vec_estrut(OsMeusCDs,'Ano');

>> outv(1)

ans =

Genero: 'Rock progressivo'

Artista: 'Marillion'

Titulo: 'Misplaced Childhood'

Ano: 1985

>> outv(2)

ans =

Genero: 'Rock'

Artista: 'Xutos e Pontapés'

Titulo: 'Circo de Feras'

Ano: 1987

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Ordenação por selecção: ordenar vectores de estruturas

20

>> outv(3)

ans =

Genero: 'Rock'

Artista: 'Metallica'

Titulo: 'Black Album'

Ano: 1991

>> outv(4)

ans =

Genero: 'Cubana'

Artista: 'Eliades Ochoa'

Titulo: 'Grandes Éxitos'

Ano: 2000

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Algoritmos de ordenação: indexação

21

• A indexação é uma alternativa à ordenação de um vector. Com

a indexação o vector original é deixado na sua ordem e apenas

se utiliza um vector com índices que ordenam o vector original.

EXEMPLO:

>> lista

lista =

67 33 21 84 49 50 75

indices =

3 2 5 6 1 7 4

>> listaOrd=lista(indices)

listaOrd =

21 33 49 50 67 75 84

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 22

Algoritmos de ordenação: indexação

• Algoritmo (ordem crescente):

1. Inicializar os valores no vector de índices: 1, 2,3,…;

2. Utilizar um algoritmo de ordenação, mas comparar oselementos na lista original utilizando o vector de índicespara indexar os elementos na lista;

3. Quando o algoritmo de ordenação trocar valores, devemser trocados os elementos do vector de índices e não osvalores da lista original.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Algoritmos de ordenação: indexação: implementação

23

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Algoritmos de ordenação: indexação: execução

24

>> lista

lista =

67 33 21 84 49 50 75

>> indOrd=createind(lista)

indOrd =

3 2 5 6 1 7 4

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 25

Ordenação por inserção linear

• Insere sucessivamente um novo elemento numa lista de elementos já ordenados

• O resultado é uma lista ordenada

Sublista tem apenas um elemento (67)

Insere 33; obtém-se uma lista com 2 items

Insere 21; obtém-se uma lista com 3 items

Insere 84; obtém-se uma lista com 4 items

Insere 49; obtém-se uma lista com 5 items

Insere 50; obtém-se uma lista com 6 items

Insere 75; obtém-se uma lista com 7 items

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 26

Ordenação por inserção linear (cont.)

6 2 4 81012Array

original

Array

ordenado

Exemplo:

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 27

Ordenação por inserção linear (cont.)

6 2 4 81012

6

Array

original

Exemplo:

Array

ordenado

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 28

Ordenação por inserção linear (cont.)

2 6

6 2 4 81012Array

original

Exemplo:

Array

ordenado

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 29

Ordenação por inserção linear (cont.)

2 6 12

6 2 4 81012Array

original

Exemplo:

Array

ordenado

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 30

Ordenação por inserção linear (cont.)

2 4 6 12

6 2 4 81012Array

original

Exemplo:

Array

ordenado

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 31

Ordenação por inserção linear (cont.)

2 4 6 10 12

6 2 4 81012Array

original

Exemplo:

Array

ordenado

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 32

Ordenação por inserção linear (cont.)

2 4 6 8 10 12

6 2 4 81012Array

original

Exemplo:

Array

ordenado

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 33

Ordenação por inserção linear (cont.):a inserção

Dado o seguinte array:

Como inserir o número 7 neste array ?

2 4 6 8 10 12

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 34

Ordenação por inserção linear (cont.):a inserção

2 4 6 8 10 12

Para inserir o 7 nesta posição, deve-se:

1. Inserir um espaço para o valor

2. Inserir o valor 7.

12

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 35

Ordenação por inserção linear (cont.):a inserção

2 4 6 8 10 12

Para inserir o 7 nesta posição, deve-se:

1. Inserir um espaço para o valor

2. Inserir o valor 7.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 36

Ordenação por inserção linear (cont.):a inserção

2 4 6 8 10 12

Para inserir o 7 nesta posição, deve-se:

1. Inserir um espaço para o valor

2. Inserir o valor 7.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 37

Ordenação por inserção linear (cont.):a inserção

2 4 6 8 1210

Para inserir o 7 nesta posição, deve-se:

1. Inserir um espaço para o valor

2. Inserir o valor 7.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 38

Ordenação por inserção linear (cont.):a inserção

2 4 6 8 1210

Para inserir o 7 nesta posição, deve-se:

1. Inserir um espaço para o valor

2. Inserir o valor 7.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 39

Ordenação por inserção linear (cont.):a inserção

2 4 6 8 12107

Para inserir o 7 nesta posição, deve-se:

1. Inserir um espaço para o valor

2. Inserir o valor 7.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 40

Ordenação por inserção linear (cont.):implementação

function b = ordenaPorInsercao(a)

% EXERCÍCIO PARA CASA !!!

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 41

Ordenação rápida

• Muito eficiente; é muitas vezes implementada de forma recursiva

• Estratégia

• Escolhe um elemento chamado de pivot

• Faz trocas de forma a que:

Todos os elementos menores que o pivot ficam à suaesquerda

Todos os elementos maiores que o pivot ficam à sua direita

• Divide as duas sublistas resultantes, cada uma com o seupivot, e efectua o mesmo tipo de trocas

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 42

Ordenação rápida (cont.)

• Seja 75 o pivot

• Procurar da direita para a esquerda por um número < 75

• Procurar da esquerda para a direita por um número > 75

• Trocar os números

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 43

Ordenação rápida (cont.)

• Continuar, desde a direita e da esquerda, efectuando as trocas necessárias

• Troca-se então o pivot com o número do meio

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 44

Ordenação rápida (cont.)

• Aplica-se de novo a ordenação rápida nas duas sublistas restantes

• Isto pode ser feito recursivamente• A âncora é o caso em que a lista examinada está vazia ou

contém apenas um elemento

• O passo recursivo (inductivo) são os casos em que a lista tem mais de um elemento

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 45

Ordenação rápida(cont.): implementação

function b = ordenacaoRapida(a)

% EXERCÍCIO PARA CASA !!!

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Algoritmos de procura

46

• Procura significa encontrar numa lista, ordenada ou

não, um dado elemento (que se irá denominar por

elemento chave)

• Existem vários algoritmos de procura:

• Procura sequencial;

• Procura binária;

• Etc ….

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 47

Procura sequencial

• Geralmente utilizada em listas não ordenadas!

• Algoritmo :

1. Utilizando um ciclo que percorra todos os elementos de uma lista, testar se o elemento na posição com índice k é igual ao elemento chave, se for retornar o índice k, casocontrário continuar a procura;

2. Se o elemento chave não for encontrado deve ser devolvido o valor 0 ou -1;

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 48

Procura sequencial

• Procura elementos consecutivos numa lista

• Começa no primeiro

• Continua até encontrar o item procurado ou até chegar aofim da lista

[1] [2] [3] [4] [5] [6] [7]

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Procura sequencial: implementação

49

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Procura sequencial: execução

50

>> lista

lista =

67 33 21 84 49 50 75

>> indice=seqsearch(lista,50)

indice =

6

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 51

Procura binária

• Utilizada em listas ordenadas!

• Algoritmo :

1. Verificar se o elemento chave é igual ao elemento do meioda lista. Se for: retornar o índice k associado;casocontrário:

2. Verificar em qual das sub-listas o elemento chave se podeencontrar. Se a sub-lista estiver vazia ir para o passo 3; caso contrário ir para o passo 1;

3. Se o elemento chave não for encontrado deve ser devolvido o valor 0 ou -1.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010 52

Procura binária

• O algoritmo mais eficiente para procurar numa listaordenada (para n items, máximo de log2n comparações)

• Começa no elemento do meio

• Compara procurado com o elemento

• Se meio < procurado, vai para meio da sublista à direita

• Se meio > procurado, vai para meio da sublista à esquerda

procurado

Note-se que procurado é

encontrado em dois passos

[1] [2] [3] [4] [5] [6] [7]

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Procura binária: implementação

53

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Procura binária: execução

54

>> lista=[11,22,33,44,55,66,77]

lista =

11 22 33 44 55 66 77

>> indice=binsearch(lista,66)

indice =

6

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função find

55

Descrição: Retorna os índices dos elementos que não são zero.

Sintaxe :

I = FIND(X) returns the linear indices

corresponding to the nonzero entries of the array

X.

X may be a logical expression.

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

A função find: exemplos

56

>> lista=[67,33,21,84,49,50,75]

lista =

67 33 21 84 49 50 75

>> indices=find(lista==33)

indices =

2

>> indices=find(lista>=33)

indices =

1 2 4 5 6 7

>> lista_proc=lista(indices)

lista_proc =

67 33 84 49 50 75

Miguel Pedro Silva – José Borges Computação e Programação 2009 / 2010

Referências

57

• Capítulo 12 (12.3—12.5) de Stormy Attaway (2009), “Matlab: A Practical Introduction to Programming and Problem Solving”, Elsevier.

• Getting started with MATLAB: http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/getstart.pdf