Sunteți pe pagina 1din 38

Disciplina: Disciplina: Cursos: Cursos:

Algoritmos e Estruturas de Dados 1 ano


Informtica para a Sade Engenharia de Sistemas Informticos (diurno e Ps-laboral) Engenharia e Desenvolvimento de Jogos Digitais

Parte III
Algoritmos de Procura Algoritmos de Ordenao

Manuela Cunha Novembro de 2010

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Procura. Algoritmo de procura linear num array desordenado e num array ordenado. Algoritmo de procura binria. Medidas de esforo e de eficincia de algoritmos.

Algoritmos de Procura
Uma das tarefas habituais a procura de informao. O problema de procura pode ser colocado da seguinte forma: Dado um conjunto de objectos A, pretende-se saber se determinado elemento X se encontra nesse conjunto. Normalmente os elementos de A so distinguveis entre si por uma determinada caracterstica a que chamamos Chave. Alm da chave, cada elemento de A tem associado um outro conjunto de caractersticas que completam a sua definio e que normalmente representam a informao til associada ao objecto Atributos. No problema de procura de um objecto X num conjunto A, os atributos so em geral irrelevantes, pelo que vamos considerar sempre o caso particular em que no existem atributos alm da chave. Assim, o objecto no se distingue da chave que o representa, e o nosso problema pode colocar-se de outra forma Dado um conjunto de chaves A e um valor especfico X, localizar a chave em A que tem o valor X. Como facilmente se percebe, a procura fortemente condicionada pela organizao da informao. A procura de uma chave num conjunto ordenado de chaves mais simples que a procura num conjunto desordenado.
---- 2 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Os problemas mais simples de procura supem que o conjunto de chaves A est armazenado num array em que cada componente desse array contm uma chave. A procura consiste em localizar a componente cujo valor coincide com o valor procurado X. Veremos um algoritmo de pesquisa linear ou sequencial e um algoritmo de pesquisa binria.

PROCURA LINEAR
A forma mais simples de efectuar a procura a chamada procura sequencial ou procura linear. Consiste em analisar todos os elementos do conjunto (do array), comeando por um extremo e avanando at encontrar o elemento procurado ou at ter percorrido todo o conjunto. Suponhamos um array A (conjunto das chaves), com N componentes de um tipo arbitrrio T. O algoritmo que a seguir se apresenta procura a chave de A cujo valor coincide com o valor armazenado em X, dando como resultado a posio desta no array (varivel I).
A: array[1..N] de tipo T X: T N, I: inteiro I 1 I I + 1

Enquanto X <> A[I] Fazer

Quando o ciclo terminar, teremos X = A[I], ou seja, o resultado pretendido. Obviamente este algoritmo falha quando no existe nenhum componente no array A que coincida com X. necessrio um novo algoritmo que tenha possibilidade de identificar essa situao.
I 1 I I + 1

Enquanto (I <= N) E (X <> A[I]) Fazer se I > N ento escrever(Erro elemento procurado no existe) Seno ...

---- 3 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Ou percorrendo o array no sentido inverso:


I N I I - 1

Enquanto (I > 0) E (X <> A[I]) Fazer se I = 0 ento escrever(Erro elemento procurado no existe)

O invariante do algoritmo (condio a ser satisfeita antes de cada iterao, ou de cada incremento da varivel I):
( 1 <= I <= N ) E ( A[k] <> X, 1 <= k < I )

A procura termina quando falhar a condio de controlo do ciclo, i.e, quando:


(( I = N+1 ) OU ( A[I] = X )) E ( A[k] <> X, 1 <= k < I )

O algoritmo termina quando encontrada a primeira ocorrncia de X, ou quando o array foi totalmente percorrido. Ser que o algoritmo pode ser simplificado, acelerando assim a procura? O algoritmo pode ser simplificado recorrendo a uma sentinela, reduzindo o nmero de comparaes por iterao:
I 1 X

A[N+1]

Enquanto A[I] <> X Fazer I I + 1

Se I > N Ento escrever(Erro elemento procurado no existe) Seno ...

A partir do mesmo invariante anterior:


( 1 <= I <= N ) E ( A[k] <> X, 1 <= k < I )

temos como condio de paragem do ciclo:


( A[I] = X ) E ( A[k] <> X, 1 <= k < I )

Evidentemente que I = N + 1 implica que no foi encontrado o elemento desejado (excepto o correspondente sentinela).

---- 4 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

E se o array estiver ordenado? Quando o array se encontra ordenado (ordem crescente ou decrescente, numrica ou alfabtica), no h necessidade de percorrer integralmente o array para concluir da no existncia da chave com valor X. O algoritmo pode parar quando encontra um elemento de valor superior a X, concluindo logo da inexistncia de X no conjunto de chaves.
I 1 I I + 1

Enquanto (I <= N) E (A[I] < X) Fazer se I > N ento escrever(Erro elemento procurado no existe) Seno ...

Ou:
I 1 X

A[N+1]

Enquanto A[I] < X Fazer I I + 1

Se I > N Ento escrever(Erro elemento procurado no existe) Seno ...

PROCURA BINRIA
Nos algoritmos de procura, a dimenso do problema definida pelo nmero de chaves (N) que podem existir no array A. Nos algoritmos de procura linear o esforo do algoritmo aumenta proporcionalmente a N, quando N aumenta. Um algoritmo nestas condies diz-se de ordem N e representa-se por O(n). Os algoritmos anteriores percorrem o array sequencialmente at uma situao de sucesso ou de falha. Uma forma de acelerar a procura consiste em utilizar uma estratgia de partio sucessiva do conjunto de chaves ao meio para diminuir em cada momento o nmero de chaves a analisar. Veremos que este algoritmo de ordem log2 N, simbolicamente O(log2 N). Isto significa que, quando N aumenta, o esforo aumenta muito mais lentamente (pense na curva da funo logaritmo). Contudo, este mtodo exige que o array das chaves se encontre ordenado.

---- 5 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

O algoritmo de procura binria explora o facto de o array estar ordenado, i.e., explora a condio: A[k-1] <= A[k], 1 <= k <= N A ideia central consiste em testar um elemento aleatrio, por ex., A[m] e compar-lo com o valor a procurar X. Se o elemento for igual a X, a procura termina. Se for menor que X, conclui-se que todos os elementos do array com ndices menores ou igual a m podem ser eliminados nos prximos testes. Se for maior que X, todos aqueles que possuem ndices maiores ou igual a m podem ser eliminados.

O algoritmo de procura binria procura isolar em cada momento uma seco (S) do array tal que, se a chave X existir no array, s pode existir nessa seco. A seco S definida por dois ndices, MIN e MAX que so, respectivamente, os ndices do primeiro e do ltimo componentes de S. O array A fica assim dividido em trs fraces: a seco S, a fraco que contm todas as componentes inferiores s componentes de S (fraco A1) e a que contm todas as componentes superiores s de S (fraco A2).

Um primeiro refinamento do algoritmo ser:


[inicializar S com A] encontrado falso

enquanto ( No encontrado ) E [ S <>

] fazer

se [for possvel localizar X imediatamente] ento [localizar X] encontrado seno [diminuir o tamanho de S ] verdadeiro

---- 6 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Vejamos agora como desenvolver os vrios passos: 1- [inicializar S com A] como S definido pelos ndices MIN e MAX, corresponde a: MAX MIN 2- [ S <> f ] S diferente do conjunto vazio enquanto MAX >= MIN 3- [for possvel localizar X imediatamente] Localizar X imediatamente corresponde a uma tentativa de comparao de X com um componente de S, que pode ser um valor aleatrio entre MIN e MAX. Vejamos o algoritmo resultante:
MIN 1; MAX N falso

N 1

encontrado

Enquanto ( No encontrado ) E ( MAX >= MIN ) fazer m [qualquer valor entre MIN e MAX]

Se A[m] = X ento posicao Seno Se A[m] < X ento MIN Seno MAX m - 1 m + 1 m; encontrado verdadeiro

O invariante de cada iterao, isto , a condio que deve ser sempre satisfeita no incio de cada passo, :
(MIN <= MAX) E ( A[k] < X, 1 <= k < MIN ) E ( A[k] > X, MAX < k <= N )

a partir do qual se pode encontrar a condio de paragem, atravs da expresso:


encontrado OU (( MIN > MAX ) E ( A[k] < X, 1 <=k < MIN) E (A[k] > X, MAX < k <= N))

o que pode ser simplificado para:


A[m] = X OU (A[k] <> X, 1 <= k <= N)

---- 7 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Embora a escolha de m seja aparentemente arbitrria, no sentido de que o algoritmo funciona independentemente dela, o valor dessa varivel influencia o algoritmo. claro que a meta eliminar, em cada passo, o maior nmero possvel de elementos em futuras buscas; a soluo ptima consiste em escolher a mediana dos elementos, j que esta escolha elimina, em qualquer caso, metade dos elementos do array. Como consequncia, o nmero mximo de iteraes ser log2N, arredondado por excesso at ao inteiro mais prximo. Assim, o desempenho deste algoritmo francamente superior ao de procura linear, onde o nmero esperado de iteraes (e consequentemente de comparaes) de N/2. A verso final do algoritmo :
MIN 1; MAX N falso

encontrado

Enquanto ( No encontrado ) E ( MAX >= MIN ) fazer m (MAX + MIN) DIV 2

Se A[m] = X ento posicao Seno Se A[m] < X ento MIN Seno MAX m - 1 m + 1 m; encontrado verdadeiro

---- 8 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

SLIDES DA AULA

Algoritmos e Estruturas de Dados

Algoritmos de Procura
Maria Manuela Cunha
mcunha@ipca.pt
2008/2009

Algoritmos de Procura

Conceitos
O problema de procura um dos mais frequentes e pode ser colocado da seguinte forma: Dado um conjunto de objectos A, procura-se saber se determinado elemento X se encontra nesse conjunto. Normalmente os elementos de A so distinguveis entre si por uma determinada caracterstica a que chamamos Chave. Alm da chave, cada elemento de A tem associado um outro conjunto de caractersticas que completam a sua definio e que normalmente representam a informao til associada ao objecto Atributos.

Algoritmos de Procura

Conceitos
Como no problema de procura de um objecto X num conjunto A, os atributos so em geral irrelevantes, vamos considerar sempre o caso particular em que no existem atributos alm da chave. Dado um conjunto de chaves A e um valor especfico X, localizar a chave em A que tem o valor X. Os problemas mais simples de procura supem que o conjunto de chaves A est armazenado num array em que cada componente desse array contm uma chave. A procura consiste em localizar a componente cujo valor coincide com o valor X. A: array[1..N] de tipo T

---- 9 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Procura Linear

Algoritmos de Procura

Procura linear
O algoritmo de procura linear percorre sequencialmente todo o array, terminando quando for satisfeita uma das duas condies seguintes: o elemento encontrado, A[i] = X o array foi pesquisado mas o elemento no foi encontrado Isto resulta no algoritmo seguinte: i1 enquanto X <> A[i] fazer ii+1 Quando o ciclo terminar, teremos X = A[i], ou seja o resultado pretendido. Este algoritmo funciona sempre ? Quando falha ?

Algoritmos de Procura

Procura linear
i1 enquanto (i <= N) E (X <> A[i]) fazer ii+1 se A[i] = X ento ......... ou, percorrendo o array no sentido inverso: iN enquanto (i > 0) E (X <> A[i]) fazer ii-1

---- 10 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Procura

Procura linear
i1 enquanto (i <= N) E (X <> A[i]) fazer ii+1 O invariante do algoritmo (condio a ser satisfeita antes de cada iterao, ou de cada incremento de i): ( 1 <= i <= N ) E ( A[k] <> X, 1 <= k < i ) A procura termina quando falhar a condio de controlo do ciclo, i.e, quando: (( i = N+1 ) OU ( A[i] = X )) E ( A[k] <> X, 1 <= k < i ) O algoritmo termina quando encontrada a 1 ocorrncia de X, ou quando o array foi totalmente percorrido. Ser que o algoritmo pode ser simplificado, acelerando assim a procura?

Algoritmos de Procura

Procura linear
Simplificao do algoritmo, recorrendo a uma sentinela, reduzindo o nmero de comparaes por iterao : i1 A[N+1] X enquanto (A[i] <> X) fazer ii+1 A partir do mesmo invariante anterior : ( 1 <= i <= N ) E ( A[k] <> X, 1 <= k < i ) temos como condio de paragem do ciclo: ( A[i] = X ) E ( A[k] <> X, 1 <= k < i ) Evidentemente que i = N + 1 implica que no foi encontrado o elemento desejado (excepto o correspondente sentinela). E se o array estiver ordenado? Proponha alteraes ao algoritmo

Procura Binria

---- 11 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Procura

10

Procura binria
Nos algoritmos de procura a complexidade do problema definida pelo nmero de chaves N. No algoritmo anterior, o esforo aumenta proporcionalmente a N (ordem de N) - O(N) - . Vamos ver um algoritmo da ordem log2 N, simbolicamente O(log N). Isto significa que, quando N aumenta, o esforo aumenta muito mais lentamente. O algoritmo de procura binria explora o facto de o array estar ordenado, i.e., explora a condio: A[k-1] <= A[k], 1 <= k <= N

Algoritmos de Procura

11

Procura binria
A ideia central consiste em testar um elemento aleatrio, por ex., A[m] e compar-lo com o valor a procurar X. Se o elemento for igual a X, a procura termina. Se for menor que X, conclui-se que todos os elementos do array com ndices menores ou igual a m podem ser eliminados nos prximos testes. Se for maior que X, todos aqueles que possuem ndices maiores ou igual a m podem ser eliminados.

Algoritmos de Procura

12

Procura binria
O algoritmo de procura binria procura isolar em cada momento uma seco do array tal que, se a chave X existir no array, s pode existir nessa seco. A seco S definida por dois ndices, MIN e MAX que so, respectivamente, os ndices do primeiro e do ltimo componentes de S. O array A fica assim dividido em trs fraces: a seco S, a fraco que contm todas as componentes inferiores s componentes de S (fraco A1) e a que contm todas as componentes superiores s de S (fraco A2).

---- 12 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Procura

13

Procura binria
Um primeiro refinamento: [inicializar S com A] encontrado falso enquanto ( No encontrado ) E [ S <> ] fazer se [for possvel localizar X imediatamente] ento [ localizar X ]; encontrado verdadeiro seno [diminuir o tamanho de S ]

Algoritmos de Procura

14

Procura binria
Vejamos agora como desenvolver os vrios passos: 1 [inicializar S com A] como S definido pelos ndices MIN e MAX, corresponde a: MAX N MIN 1 2 [ S <> ] S diferente do conjunto vazio enquanto MAX >= MIN 3 [for possvel localizar X imediatamente] Localizar X imediatamente corresponde a uma tentativa de comparao de X com um componente de S, que pode ser um valor aleatrio entre MIN e MAX.

Algoritmos de Procura

15

Procura binria
MIN 1; MAX N encontrado falso Enquanto ( No encontrado ) E ( MAX >= MIN ) fazer m [qualquer valor entre MIN e MAX] Se A[m] = X ento posicao m; encontrado verdadeiro Seno Se A[m] < X ento MIN m + 1 Seno MAX m - 1

---- 13 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Procura

16

Procura binria
O invariante de cada iterao, isto , a condio que deve ser sempre satisfeita no incio de cada passo, :
( MIN <= MAX ) E ( A[k] < X, 1 <= k < MIN) E ( A[k] > X, MAX < k <= N )

a partir do qual se pode encontrar a condio de paragem, atravs da expresso:


encontrado OU (( MIN > MAX ) E ( A[k] < X, 1 <=k < MIN) E (A[k] > X, MAX < k <= N))

o que pode ser simplificado para:


A[m] = X OU (A[k] <> X, 1 <= k <= N)

Algoritmos de Procura

17

Procura binria
Embora a escolha de m seja aparentemente arbitrria, no sentido de que o algoritmo funciona independentemente dela, o valor dessa varivel influencia o algoritmo. claro que a meta eliminar, em cada passo, o maior nmero possvel de elementos em futuras buscas; a soluo ptima consiste em escolher a mediana dos elementos, j que esta escolha elimina, em qualquer caso, metade dos elementos do array. Como consequncia, o n mximo de iteraes ser log2N, arredondado por excesso at ao inteiro mais prximo. Assim, o desempenho deste algoritmo francamente superior ao de procura linear, onde o n esperado de iteraes (e consequentemente de comparaes) de N/2.

Algoritmos de Procura

18

Procura binria
MIN 1; MAX N encontrado falso Enquanto ( ~encontrado ) E ( MAX >= MIN ) fazer m (MIN + MAX) DIV 2 Se A[m] = X ento posicao m; encontrado verdadeiro Seno Se A[m] < X ento MIN m + 1 Seno MAX m - 1

---- 14 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Procura

19

Procura binria
A eficincia pode ser ligeiramente melhorada, atravs da troca entre as 2 clusulas da comparao. A condio de igualdade deve ser testada em 2 lugar, porque o sucesso ocorre apenas uma vez em todo o processo, provocando a concluso do algoritmo. Mas possvel melhorar ainda o algoritmo, se for abandonado o princpio de terminar a procura quando for encontrado o elemento procurado. Por estranho que parea primeira vista, percebe-se que o ganho de eficincia em cada iterao ser maior do que a perda ocasionada pela comparao de alguns elementos adicionais. No nos esqueamos que o n do passo (iteraes) no mximo Log2N. A soluo mais rpida baseada na seguinte invariante: ( A[k] < X, 1 <= k < MIN ) E ( A[k] >= X, MAX <= k <= N ) e a procura continua at que os 2 limites se tenham estendido por todo o array.

Algoritmos de Procura

Procura binria
Invariante: ( A[k] < X, 1 <= k < MIN ) E ( A[k] >= X, MAX <= k <= N )

20 MIN 1; MAX N Enquanto MIN < MAX fazer

m (MIN + MAX) DIV 2 Se A[m] < X ento MIN m + 1 Seno MAX m encontrado A[MAX] = X
A condio de paragem MIN >= MAX. A diferena MAX - MIN diminui a cada iterao. A afirmao MIN < MAX ocorre no incio de cada iterao; a mediana m satisfaz MIN <= m < MAX, da que a diferena diminui de facto, ou ao se atribuir m + 1 a MIN (aumentando MIN), ou ao se atribuir m a MAX (decrementando MAX), e a repetio termina com MIN = MAX. Entretanto, MIN = MAX e o invariante ainda no so suficientes para a localizao do elemento desejado.

Algoritmos de Procura

21

Procura binria
Tente demonstrar que para pequenos valores de N a Procura Linear mais eficiente, mas que medida que N aumenta, a vantagem da Procura Binria se torna significativa, at que, para grandes valores de N, a Linear incomportvel.

---- 15 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Procura

22

Procura binria
Min m Max

X:

2 1 iterao v: 1 3 3 5 7 (>x)
Max

Min

2 iterao
Min

1
m

3 3 (>x)
Max

3 iterao

3 1 (<x)
Min Max

4 iterao

array a inspeccionar vazio o valor 2 no existe no array inicial!

Algoritmos de Procura

23

Procura binria
Em cada iterao, o tamanho do sub-array a analisar dividido por um factor de aproximadamente 2. Ao fim de k iteraes, o tamanho do sub-array a analisar aproximadamente n / 2k Se no existir no array o valor procurado, o ciclo s termina quando n / 2k 1 log2 n - k 0 k log2 n Assim, no pior caso, o n de iteraes aproximadamente log2 n o tempo de execuo O(log n) (logartmico) muito mais eficiente que a pesquisa sequencial, mas s aplicvel a arrays ordenados!

---- 16 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos e Estruturas de Dados

Algoritmos de Ordenao

Maria Manuela Cunha


2007/2008

Algoritmos de Ordenao. Ordenao por Insero Directa. Ordenao por Seleco Directa. Ordenao Sequencial por Permutao. Algoritmo de fuso de sequncias ordenadas. Medidas de esforo e eficincia de algoritmos.

Algoritmos de Ordenao
Em geral entende-se a ordenao como o processo de arranjo de um conjunto de objectos de acordo com um critrio (ordem) especfico. O objectivo da ordenao facilitar a localizao dos membros desse conjunto. A ordenao uma actividade relevante e essencial, sobretudo na rea de processamento de dados. Vejamos alguns algoritmos de ordenao de um array A de um tipo qualquer. Dado o facto de a ordenao ocorrer em memria, podem-se revelar de grande importncia os mtodos que efectuam a permutao de elementos, sendo de menor importncia os mtodos que efectuam o transporte fsico dos elementos de um array A para um array resultante B. Dentro da 1 categoria, uma boa medida de eficincia a contagem do nmero de comparaes das chaves C e o nmero de movimentos (transposies) dos elementos M. Estes nmeros (M e C) so funo do nmero de elementos N a serem ordenados.

---- 17 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

ALGORITMO DE ORDENAO POR INSERO DIRECTA


Este mtodo muitas vezes o utilizado pelos jogadores de cartas. Os elementos so divididos conceptualmente em uma sequncia de destino A[1] .. A[i-1] e uma sequncia fonte A[i] .. A[N]. Em cada iterao (iniciando-se com i=2 e incrementando-se i de 1 em 1), o i-simo elemento da sequncia retirado da sequncia fonte e transferido para a sequncia de destino, inserido na posio apropriada. O algoritmo percorre uma vez o array, e em cada iterao um novo elemento analisado e inserido na sua posio correcta. Este mtodo implica o deslocamento de alguns elementos do array. Considera-se o array dividido em dois sub-arrays (esquerdo e direito), com o da esquerda ordenado e o da direita desordenado Comea-se com um elemento apenas no sub-array da esquerda. Move-se um elemento de cada vez do sub-array da direita para o sub-array da esquerda, inserindo-o na posio correcta de forma a manter o sub-array da esquerda ordenado Termina-se quando o sub-array da direita fica vazio
ordenado desordenado

v: 1 iterao

3 2 iterao 1 3 iterao 1 4 iterao 1 5 iterao v: 1

8
desordenado

ordenado

Para

i = 2 .. N Fazer X A[i] [ inserir X no local adequado em A[1] .. A[i] ]

O processo de encontrar o local de X no array ordenado consiste em percorrer o array da direita para a esquerda, at encontrar um elemento <= X. Inserir X numa dada posio do array

---- 18 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

ordenado consiste em arrastar os valores superiores a X uma posio para a direita e colocar X nessa posio. O processo de procura e insero termina quando: - encontrado um elemento A[j] < X - atingida a extremidade esquerda do sub-array ordenado. A Insero de um elemento X num array pode ter dois pressupostos: - O array est desordenado, e a insero ter lugar aps a ltima posio ocupada. - O array est ordenado e devemos manter a ordenao aps a insero. Apenas esta ltima situao nos interessa. Assim, temos trs passos: 1 procurar a posio para a insero 2 criar espao para o elemento a inserir 3 inserir na posio adequada
ler(X) i 1 enquanto ( A[i] < X ) E ( I <= N ) fazer i i + 1 para j = N .. i fazer A[j + 1] A[j] A[i] X N N + 1

Este algoritmo termina quando: - I > N (inserir a seguir ao ltimo) - A[i] >= X (inserir na posio i ) O Algoritmo de ordenao por Insero Directa o seguinte:
A: array[1..N] de tipo T Para i = 2 .. N X A[i] j i Enquanto j > 1 E A[j-1] > X Fazer Fazer

A[j] A[j-1] j j - 1 A[j] X


---- 19 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

De forma a eliminar a necessidade de incluso de 2 condies de paragem no ciclo de procura e insero, colocamos uma sentinela (o valor X) na posio A[0].
Para i = 2 .. N Fazer X A[i] A[0] X j i Enquanto A[j-1] > X Fazer

A[j] A[j-1] j j - 1 A[j] X

Veja nos slides a anlise do esforo dos algoritmos.

ALGORITMO DE ORDENAO POR SELECO DIRECTA


O objectivo deste algoritmo considerar que, no incio de cada ciclo, o array A se pode decompor em duas seces, A1 e A2. Neste mtodo exige-se que: - A seco A1 esteja ordenada - Qualquer elemento de A2 maior ou igual a qualquer elemento de A1 Quando A1 atingir A, o processo encontra-se completo. Este mtodo baseado no seguinte princpio: 1. Seleccionar o elemento que apresenta a chave de menor valor 2. Troc-lo com o 1 elemento da sequncia A[1] 3. Repetir esta operao envolvendo agora apenas os N-1 elementos restantes, depois os N-2 elementos, etc., at restar um s elemento em A2, o maior deles.
A: array[1..N] de tipo T Para i = 1 .. N-1 Fazer PosMin Min Para i A[i] j = i+1 .. N Fazer Se A[j] < Min Ento PosMin Min A[PosMin] A[i] Min A[i] j A[PosMin]

---- 20 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Anlise do Algoritmo: -- o nmero de comparaes C = (N-1) * N/2 - o n de movimentaes de: no mnimo: M = 3*(N-1) e no mximo: M = 3*(N-1) + (N-1)*N/2 abstemo-nos de demonstrar que no caso mdio: M = N * (Log(N)+0,57)

ALGORITMO DE ORDENAO POR PERMUTAO


Apesar de a permutao (ou troca) estar presente no algoritmo anterior, ela a caracterstica principal deste processo.
Para i = 1 .. N-1 Fazer Para j = i+1 .. N Fazer Se A[j] < A[i] Ento Temp A[i] A[j] A[i] A[j] Temp

A sua eficincia inferior eficincia do algoritmo de Seleco Directa. Tente demonstrar porqu, identificando o nmero de comparaes e de transposies.

ALGORITMO DE ORDENAO POR BUBBLE SORT


Para i = N-1 .. 1 (step -1) Fazer Para j = 1 .. i Fazer Se A[ j ] > A[ j+1 ] Ento Temp A[ j ] A[ j ] A[ j+1 ] A[ j+1 ] Temp

O bubble sort, ou ordenao por flutuao (literalmente "por bolha"), um algoritmo de ordenao dos mais simples. A ideia comparar dois elementos e troc-los de posio, at que os elementos de maior valor sejam levados para o final do array. O processo continua at a ordenao total do vector lembrando a forma como as bolhas em um tanque de gua procuram seu prprio nvel, e disso vem o nome do algoritmo. A complexidade desse algoritmo de ordem quadrtica (O(n)). Por isso, ele no recomendado para programas que precisem de velocidade e operem com quantidade elevada de

---- 21 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

dados. Tambm necessria uma condio de paragem, geralmente uma flag ou varivel que armazena se houve troca ou no troca na passagem. Se uma passagem chega ao seu final sem troca a ordenao cessa.
HouveTroca Enquanto Verdadeiro Fazer

HouveTroca

HouveTroca Falso Para i = 1 .. N-1 Se Fazer

A[i] > A[i+1] Ento Temp A[i] A[i] A[j] A[j] Temp HouveTroca Verdadeiro

Existe um mtodo sofisticado e extremamente eficiente de ordenao baseado no Bubblesort, que o Quicksort. Trata-se de um algoritmo recursivo que no abordaremos na nossa disciplina.

ANLISE E COMPARAO DO ESFORO DOS ALGORITMOS


Na tabela abaixo apresenta-se, para cada mtodo, o nmero de comparaes C e de transposies (ou acessos ao array a ordenar) M . Em cada caso, apresentam-se os valores mnimos (quando o array a ordenar j se encontra ordenado), os valores mximos e os valores mdios. Mnimo Insero Directa C= M= Seleco Directa C= M= Permutao C= M= N-1 3(N - 1) (N2 - N) /2 3(N - 1) (N2 - N) /2 0 Mdio (N2 + N - 2) / 4 (N2 + 9N - 10) / 4 (N2 - N) /2 N * (Log N + 0,57) (N2 - N) /2 (N2 - N) * 0,75 Mximo (N2 - N) /2 (N2 + 3N - 4) / 2 (N2 - N) /2 (N2 + 5N 6) / 2 (N2 - N) /2 (N2 - N) * 1,5

---- 22 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

ALGORITMO DE FUSO DE SEQUNCIAS ORDENADAS (MERGE)


Veremos um algoritmo importante que permite fazer a fuso (merge) de duas sequncias ordenadas. O problema de merge consiste no seguinte: Dadas duas estruturas ordenadas, f e g, procura-se construir uma terceira estrutura, tambm ordenada, cujas componentes constituem a unio dos conjuntos de componentes de f e g. Para ilustrar este caso vamos usar dois arrays, F e G, ordenados, de comprimento respectivamente N1 e N2, criando por merge um array H. Utilizaremos os ndices i1 e i2 para os arrays F e G e o ndice j para o array H.

j i1

0 1; i2 1

enquanto ( i1 <= N1 ) E ( i2 <= N2 ) fazer se F[i1] < G[i2] ento j H[j] i1 seno j H[j] i2 enquanto j H[j] i1 enquanto j H[j] i2 i1 <= N1 j + 1 F[i1] i1 + 1 i2 <= N2 j + 1 G[i2] i2 + 1 fazer j + 1 G[i2] i2 + 1 fazer j + 1 F[i1] i1 + 1

---- 23 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

SLIDES DA AULA

Algoritmos e Estruturas de Dados

Algoritmos de Ordenao

Maria Manuela Cunha


2007/2008

Algoritmos de Ordenao

31

Conceitos
Em geral entende-se a ordenao como o processo de arranjo de um conjunto de objectos de acordo com um critrio (ordem) especfico. O objectivo da ordenao facilitar a localizao dos membros desse conjunto. A ordenao uma actividade relevante e essencial, sobretudo na rea de processamento de dados. A escolha de um algoritmo depende da estrutura de dados a ser processada, pelo que se distinguem: - algoritmos de ordenao de arrays - algoritmos de ordenao de ficheiros sequenciais Estas duas classes so frequentemente chamadas de ordenao interna e externa, porque os arrays so armazenados na memria principal, enquanto os arquivos se encontram em memria secundria.

---- 24 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao

32

Conceitos
Estruturao de um conjunto de fichas, formando um array, colocadas em frente de um ordenador de tal forma que seja possvel o acesso individual directo a cada ficha.

Estruturar as fichas na forma de um arquivo, de acesso sequencial, implica que somente a ficha do topo de cada pilha visvel.

Algoritmos de Ordenao

33

Conceitos
Dado o facto de a ordenao ocorrer em memria, podem-se revelar de grande importncia os mtodos que efectuam a permutao de elementos, sendo de menor importncia os mtodos que efectuam o transporte fsico dos elementos de um array A para um array resultante B. Dentro da 1 categoria, uma boa medida de eficincia a contagem do nmero de comparaes das chaves C e o nmero de movimentos (transposies) dos elementos M. Estes nmeros (M e C) so funo do nmero de elementos N a serem ordenados.

---- 25 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao

34

Conceitos
Enquanto os bons algoritmos de ordenao exigem cerca de N * log N comparaes, as tcnicas simples de ordenao designadas mtodos directos, exigem um nmero de comparaes da ordem de N2. Os mtodos de ordenao que ordenam os elementos in situ podem ser classificados em: - ordenao por Insero Directa (Insertion Sort) - ordenao por Seleco Directa - ordenao por Troca e Bubble Sort

Algoritmo de Ordenao por Insero Directa

---- 26 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao

36

Ordenao por Insero Directa


Este mtodo muitas vezes o utilizado pelos jogadores de cartas. Os elementos so divididos conceptualmente em uma sequncia de destino A[1] .. A[i-1] e uma sequncia fonte A[i] .. A[N]. Em cada iterao (iniciando-se com i=2 e incrementando-se i de 1 em 1), o i-simo elemento da sequncia retirado da sequncia fonte e transferido para a sequncia de destino, inserido na posio apropriada. O algoritmo percorre uma vez o array, e em cada iterao um novo elemento analisado e inserido na sua posio correcta. Este mtodo implica o deslocamento de alguns elementos do array.

Algoritmos de Ordenao

37

Ordenao por Insero Directa


Considera-se o array dividido em dois sub-arrays (esquerdo e

direito), com o da esquerda ordenado e o da direita desordenado Comea-se com um elemento apenas no sub-array da esquerda. Move-se um elemento de cada vez do sub-array da direita para o sub-array da esquerda, inserindo-o na posio correcta de forma a manter o sub-array da esquerda ordenado Termina-se quando o sub-array da direita fica vazio

---- 27 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao

38

Ordenao por Insero Directa


ordenado desordenado

v: 1 iterao

3 2 iterao 1 3 iterao 1 4 iterao 1 5 iterao v: 1

8
desordenado

ordenado

Algoritmos de Ordenao

39

Ordenao por Insero Directa


Para i = 2 .. N Fazer X A[i] [ inserir X no local adequado em A[1] .. A[i] ]
O processo de encontrar o local de X no array ordenado consiste em percorrer o array da direita para a esquerda, at encontrar um elemento <= X. Inserir X numa dada posio do array ordenado consiste em arrastar os valores superiores a X uma posio para a direita e colocar X nessa posio. O processo de procura e insero termina quando: - encontrado um elemento A[j] < X - atingida a extremidade esquerda do sub-array ordenado

---- 28 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao

40

Ordenao por Insero Directa


ALGORITMO DE INSERO DE UM VALOR X NUM ARRAY ORDENADO A Insero de um elemento num array pode ter dois pressupostos: - O array est desordenado, e a insero ter lugar aps a ltima posio ocupada. - O array est ordenado e devemos manter a ordenao aps a insero. Apenas esta ltima situao nos interessa. Assim, temos trs passos:

Algoritmos de Ordenao

41

Ordenao por Insero Directa


ALGORITMO DE INSERO DE UM VALOR X NUM ARRAY ORDENADO 1 procurar a posio para a insero 2 criar espao para o elemento a inserir 3 inserir na posio adequada
ler(X) i1 enquanto ( A[i] < X ) E ( I <= N ) fazer ii+1 para j = N .. i fazer A[j + 1] A[j] A[i] X NN+1 Este algoritmo termina quando: I > N (inserir a seguir ao ltimo) A[i] >= X (inserir na posio i )

---- 29 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao

42

Ordenao por Insero Directa


Para i = 2 .. N Fazer X A[i] ji Enquanto j > 1 E A[j-1] > X Fazer

A[j] A[j-1] jj-1

A[j] X

Algoritmos de Ordenao

43

Ordenao por Insero Directa


De forma a eliminar a necessidade de incluso de 2 condies de paragem no ciclo de procura e insero, colocamos uma sentinela (o valor X) na posio A[0]. Para i = 2 .. N Fazer X A[i] A[0] X ji Enquanto A[j-1] > X Fazer

A[j] A[j-1] jj-1

A[j] X

---- 30 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao Para i = 2 .. N Fazer X A[i] ; Ordenao por Insero DirectaA[0] X ; j i Enquanto A[j-1] > X Fazer A[j] A[j-1] j j-1 A[j] X Anlise do Algoritmo:

44

- O nmero de comparaes (C) das chaves no i-simo teste varia entre 1 e i-1 o que corresponde a uma mdia de i/2. O nmero mdio de movimentos i.e. de atribuio de valores aos elementos (M) de Ci + 3 (incluindo a sentinela). - No total, o nmero de comparaes : - no melhor caso (array ordenado): 1 + 1 + ... 1 (N-1 vezes) ~= N - no pior caso: 1 + 2 + 3 + ... + N-1 = N(N-1)/2 ~= N2/2 - em mdia ser aprox N2/4 - Concluso, O(N2)

Algoritmos de Ordenao

45

Ordenao por Insero Directa (com Proc. Binria)


O algoritmo de insero pode ser melhorado se utilizarmos a procura binria no sub-array ordenado: Para i = 2 .. N Fazer X A[i] ; MIN 1 ; MAX i Enquanto MIN < MAX Fazer m (MIN + MAX) DIV 2 Se A[m] <= X Ento MIN m + 1 Seno MAX m Para J = i .. MAX +1 (-1) Fazer A[j] A[j-1] A[MAX] X

C = N * (Log N) M = O(N2 )

como a operao de transposio mais demorada que a de comparao, conclumos no existirem melhorias significativas
(para quem estiver interessado, N. Wirth, pag 55 e 56)

---- 31 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmo de Ordenao por Seleco Directa

Algoritmos de Ordenao

47

Ordenao por Seleco Directa


O objectivo deste algoritmo considerar que, no incio de cada ciclo, o array A se pode decompor em duas seces, A1 e A2. Neste mtodo exige-se que: - A seco A1 esteja ordenada - Qualquer elemento de A2 maior ou igual a qualquer elemento de A1 Quando A1 atingir A, o processo encontra-se completo. Este mtodo baseado no seguinte princpio: 1. Seleccionar o elemento que apresenta a chave de menor valor 2. Troc-lo com o 1 elemento da sequncia A[1] 3. Repetir esta operao envolvendo agora apenas os N-1 elementos restantes, depois os N-2 elementos, etc, at restar um s elemento, o maior deles.

---- 32 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao

48

Ordenao por Seleco Directa


Para i = 1 .. N-1 Fazer PosMin i Min A[i] Para j = i+1 .. N Fazer Se A[ j ] < Min Ento PosMin j Min A[PosMin] A[PosMin] A[i] A[i] Min

Algoritmos de Ordenao 1 .. N-1 Fazer Para i = PosMin i ; Min Ordenao por Seleco Directa A[i] Para j = i+1 .. N Fazer Se A[j] < Min Ento

49

PosMin j ; Min A[PosMin] A[PosMin] A[i] A[i] Min

Anlise do Algoritmo: - O nmero de comparaes C = (N-1) * N/2 ~= (N2 - N) / 2 - O n de movimentaes de: no mnimo: M = 3*(N-1) e no mximo: M = 3*(N-1) + (N-1)*N/2 ~= N2/2 + 5/2N abstemo-nos de demonstrar que no caso mdio: M = N * (Log(N)+0,57) pelo que podemos concluir que este algoritmo mais eficiente que o de Insero Directa

---- 33 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmo de Ordenao por Permutao

Algoritmos de Ordenao

76

Ordenao por Permutao


Apesar de a permutao estar presente nos 2 algoritmos anteriores, ela caracterstica principal deste processo. Para i = 1 .. N-1 Fazer Para j = i+1 .. N Fazer Se A[ j ] < A[ i ] Ento Temp A[ i ] ; A[ i ] A[ j ] ; A[ j ] Temp

Semelhante ao Bubblesort

A sua eficincia inferior eficincia do algoritmo de Seleco Directa.

---- 34 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao

77

Ordenao por Permutao / Bubble Sort


O bubble sort, ou ordenao por flutuao (literalmente "por bolha"), um algoritmo de ordenao dos mais simples. A ideia comparar dois elementos e troc-los de posio, at que os elementos de maior valor sejam levados para o final do array. O processo continua at a ordenao total do vector lembrando a forma como as bolhas em um tanque de gua procuram seu prprio nvel, e disso vem o nome do algoritmo. A complexidade desse algoritmo de ordem quadrtica (O(n)). Por isso, ele no recomendado para programas que precisem de velocidade e operem com quantidade elevada de dados. Tambm necessria uma condio de paragem, geralmente uma flag ou varivel que armazena se houve troca ou no troca na passagem. Se uma passagem chega ao seu final sem troca a ordenao cessa.

Algoritmos de Ordenao

78

Ordenao por Permutao / Bubble Sort


Para i = N-1 .. 1 (step -1) Fazer Para j = 1 .. i Fazer Se A[ j ] > A[ j+1 ] Ento Temp A[ j ] ; A[ j ] A[ j+1 ] ; A[ j+1 ] Temp

A sua eficincia inferior eficincia do algoritmo de Seleco Directa. Existe um mtodo sofisticado e extremamente eficiente de ordenao baseado no Bubblesort, que o Quicksort. Trata-se de um algoritmo recursivo mas que no vai ser abordado.

---- 35 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao

79

Ordenao por Bubble Sort


HouveTroca Verdadeiro Enquanto HouveTroca Fazer HouveTroca Falso Para i = 1 .. N-1 Fazer Se A[i] > A[i+1] Ento Temp A[i] A[i] A[j] A[j] Temp HouveTroca Verdadeiro

Algoritmos de Ordenao

55

Comparao dos Mtodos de Orden. Directa


Mnimo
Insero Directa Seleco Directa C= M= C= M= N-1 3(N - 1) (N2 - N) /2 3(N - 1) (N2 - N) /2 0

Mdio
(N2 + N - 2) / 4 (N2 + 9N - 10) / 4 (N2 - N) /2 N * (Log N + 0,57) (N2 - N) /2 (N2 - N) * 0,75

Mximo
(N2 - N) /2 (N2 + 3N - 4) / 2 (N2 - N) /2 (N2 + 5N 6) / 2 (N2 - N) /2 (N2 - N) * 1,5

Permutao C = Directa M=

Comparaes e transposies

---- 36 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmo de Ordenao de Sequncias

Algoritmos de Ordenao

57

Mtodos de Ordenao de Sequncias


Veremos um algoritmo importante que permite fazer a fuso (merge) de duas sequncias ordenadas. O problema de merge consiste no seguinte: Dadas duas estruturas ordenadas, f e g, procura-se construir uma terceira, ordenada cujas componentes constituem a unio dos conjuntos de componentes de f e g. Para ilustrar este caso vamos usar dois arrays, F e G, ordenados, de comprimento respectivamente N1 e N2, criando por merge um array H. Utilizaremos os ndices i1 e i2 para os arrays F e G e o ndice j para o array H.

---- 37 ----

Algoritmos e Estruturas de Dados Parte III (Alg. de Procura e de Ordenao) Texto de Apoio e Slides

Algoritmos de Ordenao 0 ; i1 1 ; i2 1 j se F[i1] < G[i2] ento jj+1 H[j] F[i1] i1 i1 + 1 seno jj+1 H[j] G[i2] i2 i2 + 1 enquanto i1 <= N1 fazer jj+1 H[j] F[i1] i1 i1 + 1 enquanto i2 <= N2 fazer jj+1 H[j] G[i2] i2 i2 + 1

58

enquanto ( <= N1 ) E ( i2 <= Mtodos de Ordenao dei1Sequncias N2 ) fazer

---- 38 ----

S-ar putea să vă placă și