Escolar Documentos
Profissional Documentos
Cultura Documentos
5 Aca Metodos de Ordenacao
5 Aca Metodos de Ordenacao
Mtodos de Ordenao - seleo e insero - seleo e troca (bubble sort) - merge e quick i k sort t - radix - hashing
Prof. Rodrigo Rocha prof.rodrigorocha@yahoo.com http://www.bolinhabolinha.com
Onde Estamos
Ementa
Reviso:
Estrutura de dados;Crescimento de funes; Induo matemtica e mtodos matemticos matemticos.
Medidas de complexidade, anlise assinttica de limites de complexidades. Exemplos de anlise de algoritmo iterativos e recursivos. Anlise de desempenho de alguns algoritmos clssicos de busca e ordenao. Introduo aos principais paradigmas do projeto de algoritmos. Complexidade do Problema: Limites de Complexidade, Intratabilidade, Classes P, NP, problemas Np completos e NP-difceis.
Introduo
Atividade fundamental na computao Mtodo de rearranjar um conjunto de dados em ordem crescente ou decrescente Mtodos estudados:
Seleo (Selection sort) Insero (Insertion sort) Seleo e Troca (Bubble Sort) Intercalao (Merge Sort) Particionamento (troca) (QuickSort) Radix
Ordenao Interna
Simples Adequados para pequenos arquivos O(n2) Eficientes Arquivos maiores que requerem n(log n)
Animao
http://www.cs.pitt.edu/~kirk/cs1501/animations/Sort3.html
Pior caso
entrada na ordem inversa O(n2)
Caso C mdio di
O(n2)
Incio:
U = conjunto desordenado de valores S = vazio
Termino:
U = vazio S = conjunto ordenado de valores
mova todos os valores em S que forem maiores que V um espao a direita insira V no espao remanescente em S
Repetir at todos os valores em U estarem inseridos em S No final, S ocupa o mesmo espao que A
Pior caso
entrada na ordem inversa O(n2)
Caso mdio
O(n2)
Em cada passo
maior valor empurrado para o fim item(s) no final do vetor esto ordenados menor valor movido uma posio a menos no final
Entre parnteses esto as comparaes SubLista contm o ltimo valor 34, e est ordenado
subLista que contm os dois ltimos valores 21 26 34 esto ordenados Depois do passo i, o ltimo valor de i est ordenado
(Aps) Passo 5:
A =3 5 9 6 | 14 18 21 26 34
(Aps) Passo 6:
A = 3 5 6 | 9 14 18 21 26 34
(Aps) Passo 7:
A = 3 5 6 | 9 14 18 21 26 34
10
Caso mdio
metade do tempo n(n+1)/4 proporcional a n2
Pior o Caso
vetor ordenado decrescente uma troca por comparao n(n+1)/2 = O(n2)
11
Merge sort
Refinamento da estretgia de dividir para conquistar Para ordenar n valores em um vetor A[0:n-1], na ordem ascendente:
1. Dividir a seqncia A em duas metades, esquerda E e direita D 2. MergeSort a seqncia esquerda E 3. MergeSort a seqncia direira D Unir as seqncias direita e esquerda em um resultado S Utilizar recursividade para ordenar os dois lados O corao do MergeSort o passo de unio
Merge sort
Passo de unio
Assumimos duas seqncias ordenadas D e E Para juntar os valores de D e E em uma nova seqncia ordenada S
repetidamente
1. compare os valores iniciais de D e E 2. coloque o menor em S 3. (Se uma das seqncias estiver vazia, copiar os elementos restantes dentro de S
Resultado:
S contm todos os elementos de D e E ordenados
12
Merge sort
MergeSort A =18 26 3 9 34 5 21 14 6
Divide A: E = 18 26 3 9 e D =34 5 21 14 6 MergeSort E:
Divide E: EE = 18 26 e ED =3 9 MergeSort EE:
Divide EE: EEE = 18 e EED = 26 MergeSort EEE: ( j est ordenado) MergeSort EED: (j est ordenado) Merge 18 (EEE ordenado) e 26 (EED ordenado): Resultado: 18 26
MergeSort ED: ... Resultado: 3 9 Merge 18 26 (EE ordenado) e 3 9(ED ordenado): Resultado: 3 9 18 26
13
14
15
Merge Sort
void mergesort(int a[ ], int low, int high) { if(low == high) return; int length = high-low+1; int pivot = (low+high) / 2; mergesort(a, low, pivot); mergesort(a pivot+1 mergesort(a, pivot+1, high); int working[ ] = new int[length]; for(int i = 0; i < length; i++) working[i] = a[low+i]; int m1 = 0; int m2 = pivot-low+1; for(int i = 0; i < length; i++) { if(m2 <= high-low) if(m1 <= pivot-low) if(working[m1] ( g[ ] > working[m2]) g[ ]) a[i+low] = working[m2++]; else a[i+low] = working[m1++]; else a[i+low] = working[m2++]; else a[i+low] = working[m1++]; } }
Merge sort
Estratgia
Dividir um vetor A de n elementos em duas metades (vetores) E[0:meio] e D[meio+1:n-1] Combinar as metades ordenadas E e D unindo-as em um nico resultado ordenado Ateno
requer um vetor adicional de tamanho igual ao que ir ser ordenado se somente o vetor original ocupa toda memria, merge sort no ir funcionar se voc tem bastante espao, merge sort a melhor escolha
Complexidade
Caso mdio
O(n log n)
Pior caso
O(n log n)
16
Merge Sort
1-) Simular o processo do algoritmo de ordenao Merge Sort para o seguinte conjunto de valores:
10,3,6,12,33,21,56,2,13,1
17
Quick sort
QuickSort foi descoberto em 1962. Refinamento do algoritmo de dividir para conquistar Para ordenar n valores em um vetor A[0:n-1], na ordem ascendente:
1. Particionar a seqncia A em direita D e esquerda E utilizando um valor de A como piv 2. QuickSort a poro esquerda E. 3. QuickSort a poro direita D.
o corao do QuickSort o passo de Particionar partir o vetor em dois sub vetores, tal que todos os elementos do primeiro sejam menores ou iguais a todos os elementos do segundo
percorro o vetor de baixo para cima at achar um valor que seja maior que o piv percorro o vetor de cima para baixo at achar um valor que seja menor que o piv troca troca-se se os dois elementos (aquele que no era menor que o piv com aquele que no era maior que o piv) trmino = quando os percursos se cruzarem:
dois grupos, um abaixo do piv, com elementos menor que este outro acima do piv, com elementos maiores que este
18
19
20
Exemplo
21
Quick sort
Algoritmo
void quicksort (int[] a, int lo, int hi) {
// lo o ndice mais baixo, hi o ndice mais alto // da regio do vetor que ir ser ordenada
int i=lo, i=lo j=hi, j=hi h; int x=a[(lo+hi)/2]; // particionamento do { while (a[i]<x) i++; while (a[j]>x) j--; if (i<=j) { h=a[i]; a[i]=a[j]; a[j]=h; i++; j--; } } while (i<=j); // recurso if (lo<j) quicksort(a, lo, j); if (i<hi) quicksort(a, i, hi); }
Quick sort
Complexidade
melhor caso (a)
cada particionamento produz duas partes de tamanhos iguais O(n log n) - log n cada metade
22
Animaes na web
http://www http://www.cs.oswego.edu/~mohammad/classes/c cs oswego edu/~mohammad/classes/c sc241/samples/sort/Sort2-E.html
Radix sort
dois tipos
least significant digit (LSD)
dgito menos significativo
23
Radix sort
Processo do LSD
Pegue o ltimo digito mais significativo de cada chave Agrupe as chaves baseado no dgito, mantendo a ordem original g das chaves repita o processo para os outros dgitos mais significativos
Exemplo
Original, lista desordenada: 170, 45, 75, 90, 2, 24, 802, 66 Ordenando pelo ltimo digito (unidade)
170 90 170, 90, 2 2, 802 802, 24 24, 45 45, 75 75, 66
Ateno: 2 est antes do 802, pois ele ocorre antes na lista original. Assim como o 170 e 90. Ordenando o prximo dgito (dezena)
2, 802, 24, 45, 66, 170, 75, 90 2, 24, 45, 66, 75, 90, 170, 802
O(n)
24
Radix sort
Animaes na web
http://wwwcse.uta.edu/ holder/courses/cse5311/lectures/ap cse.uta.edu/~holder/courses/cse5311/lectures/ap plets/radix/RadixSort.html
Exerccios
Modifique o programa selection sort para sempre jogar o maior elemento para o final, ao invs do menor para o comeo. A complexidade mudou? Justifique. Modifique o programa selection sort para ordenar de forma decrescente
25
Exerccios
1-) Considerando os vetores abaixo:
a-) [ 10, 1, 9, 2, 8, 3 ] b-) [ 8,9,7,9,3,2,3,8,4,6 ] c-) [ 1,4,6,8,12,11 ] d-) [ 13,33,43,53,63 ]
Desenhe a seqncia de passos realizados para orden-los, utilizando os mtodos de busca insertion sort e bubble sort. Qual a complexidade de cada ordenao para cada vetor?
2-) Se para cada comparao feita no algoritmo de ordenao bubble sort, voc realiza-se uma busca seqencial, com que complexidade ficaria este novo algoritmo? 3-) Se a busca implementada no exerccio 2 fosse binria, a complexidade mudaria? Justifique. 4-) Um programador desconfiado, achou melhor implementar em cada iterao do insertion sort (no vetor parcialmente ordenado S), uma verificao, para isso, executa o procedimento de ordenao bubble sort na parte ordenada pelo insertion sort. Voc acredita que foi uma boa escolha ? Justifique ?
Exerccios 1-) Simular a ordenao por quick sort no seguinte conjunto de valores:
7, 7 1, 1 3, 3 9, 9 8 8, 4, 4 2, 2 7 7, 4 4, 2 2, 3 3, 5 5.
26
Radix sort
Exerccio
Ordenar utilizando radix sort os seguintes conjuntos:
a-)
45 93 38 74 39 32 72 14 92 5 91 66
Radix sort
Exerccio
Ordenar utilizando radix sort os seguintes conjuntos:
b-) 111
12 11 1 33 22 112 2 96 55 14 66
27
Bibliografia
Livro texto
ZIVIANI, Nivio. Projeto de Algoritmos : com implementao em Pascal e C.. 2 ed. So Paulo: Pioneira Thomson Learning, 2004. , Paulo A. S.. Estrutura de Dados. 1 ed. So Paulo: Campus, p , VELOSO, 1983. CORMEN, Thomas H. Algoritmos : teoria e prtica. 1 ed. Rio de Janeiro: CAMPUS, 2002.
Complementar
SCHILDT, Herbert. C Completo e Total. 3 ed. So Paulo: Pearson Education, 2005. CELES, Waldemar; CERQUEIRA, Renato. Introduo a Estruturas de Dados : com tcnicas de programao em C. 4 ed. Rio de Janeiro: Elsevier, 2004 WIRTH, Niklaus. Algoritmos e Estruturas de Dados. 1 ed. Rio de Janeiro: LTC, 1989 TENENBAUM, Aaron M; SOUZA, Tereza Cristina Flix de. Estruturas de Dados usando C. 1 ed. So Paulo: Makron Books,1995.
28