Professional Documents
Culture Documents
23/10/09
Tpicos Principais
! Introduo ! Ordenao bolha (bubble sort)! ! Ordenao rpida (quick sort)!
! Verso iterativa ! Verso recursiva
23/10/09
Introduo
! Ordenao de vetores:
! entrada: vetor com os elementos a serem ordenados ! sada: mesmo vetor com elementos na ordem especificada
! ordenao:
! pode ser aplicada a qualquer dado com ordem bem definida ! vetores com dados complexos (structs)!
! chave da ordenao escolhida entre os campos ! elemento do vetor contm apenas um ponteiro para os dados ! troca da ordem entre dois elementos = troca de ponteiros
23/10/09
Ordenao Bolha
! Ordenao bolha:
! processo bsico:
! quando dois elementos esto fora de ordem, troque-os de posio at que o i-simo elemento de maior valor do vetor seja levado para as posies finais do vetor
2 maior elemento v4 v5 2 2 2
0
3 maior elemento v6 2 1
0
2 4 4 4
1
5 5 5 1
2
1 1 1 5
3
4 4 1
1
1 1 4
2
5 5 5
3
1 2
1
4 4
2
5 5
3
Ordenao Bolha
25 25 25 25 25 25 25 25
48 48 37 37 37 37 37 37
37 37 48 12 12 12 12 12
12 12 12 48 48 48 48 48
57 57 57 57 57 57 57 57
86 86 86 86 86 86 33 33
33 33 33 33 33 33 86 86
92 92 92 92 92 92 92 92
23/10/09
Ordenao Bolha
25 25 25 25 25 25 25
37 37 12 12 12 12 12
12 12 37 37 37 37 37
48 48 48 48 48 48 48
57 57 57 57 57 33 33
33 33 33 33 33 57 57
86 86 86 86 86 86 86
92 92 92 92 92 92 92
25x37 37x12 troca 37x48 48x57 57x33 troca 57x86 final da segunda passada
23/10/09
Ordenao Bolha
25 12 12 12 12 12 12 25 25 25 25 25 37 37 37 37 37 37 48 48 48 48 33 33 33 33 33 33 48 48 57 57 57 57 57 57 86 86 86 86 86 86 92 92 92 92 92 92 25x12 troca 25x37 37x48 48x33 troca 48x57 final da terceira passada
12 12 12 12
25 25 25 25
33 33 33 33
37 37 37 37
48 48 48 48
57 57 57 57
86 86 86 86
92 92 92 92
final da ordenao
8
Ordenao Bolha
! Implementao Iterativa(I): /* Ordenao bolha */ void bolha (int n, int* v)! { int fim,i; for (fim=n-1; fim>0; fim--)! for (i=0; i<fim; i++)! if (v[i]>v[i+1]) { int temp = v[i] /* troca */ v[i] = v[i+1]; v[i+1] = temp; } }
23/10/09 (c) Dept. Informtica - PUC-Rio 9
Ordenao Bolha
! Implementao Iterativa (II):
/* Ordenao bolha (2a. verso) */ void bolha (int n, int* v)! pra quando h { int i, fim; uma passagem inteira for (fim=n-1; fim>0; fim--) { int troca = 0; sem trocas for (i=0; i<fim; i++) if (v[i]>v[i+1]) { int temp = v[i]; /* troca */ v[i] = v[i+1]; v[i+1] = temp; troca = 1; } if (troca == 0) return; /* no houve troca */ } }
23/10/09 (c) Dept. Informtica - PUC-Rio 10
Ordenao Bolha
! Esforo computacional:
! esforo computacional ! nmero de comparaes ! nmero mximo de trocas
! primeira passada: n-1 comparaes ! segunda passada: n-2 comparaes ! terceira passada: n-3 comparaes ! ...
23/10/09
11
Ordenao Bolha
! Implementao recursiva:
/* Ordenao bolha recursiva */ void bolha_rec (int n, int* v)! { int i; int troca = 0; for (i=0; i<n-1; i++) if (v[i]>v[i+1]) { int temp = v[i]; /* troca */ v[i] = v[i+1]; v[i+1] = temp; troca = 1; } if (troca != 0)&&(n>1) /* houve troca e n>1 */ bolha_rec(n-1,v); }
23/10/09 (c) Dept. Informtica - PUC-Rio 12
Ordenao Rpida
! Ordenao rpida (quick sort):
! escolha um elemento arbitrrio x, o piv ! rearrume o vetor de tal forma que x fique na posio correta v[i]
! x deve ocupar a posio i do vetor sse todos os elementos v[0], v[i1] so menores que x e todos os elementos v[i+1], , v[n1] so maiores que x
! chame recursivamente o algoritmo para ordenar os (sub-)vetores v[0], v[i1] e v[i+1], , v[n1] ! continue at que os vetores que devem ser ordenados tenham 0 ou 1 elemento
23/10/09
13
Ordenao Rpida
! Esforo computacional:
! melhor caso:
! piv representa o valor mediano do conjunto dos elementos do vetor ! aps mover o piv para sua posio, restaro dois sub-vetores para serem ordenados, ambos com o nmero de elementos reduzido metade, em relao ao vetor original ! algoritmo O(n log(n))!
! pior caso:
! piv o maior elemento e algoritmo recai em ordenao bolha
! caso mdio:
! algoritmo O(n log(n))!
23/10/09 (c) Dept. Informtica - PUC-Rio 14
Ordenao Rpida
! Rearrumao do vetor para o piv de x=v[0]:
! do incio para o final, compare x com v[1], v[2], at encontrar v[a]>x ! do final para o incio, compare x com v[n1], v[n2], at encontrar v[b]<=x ! troque v[a] e v[b] ! continue para o final a partir de v[a+1] e para o incio a partir de v[b1] ! termine quando os pontos de busca se encontram (b<a)! ! a posio correta de x=v[0] a posio b e v[0] e v[b] so trocados
23/10/09
15
25 48 37 12 57 86 33 92 25 48 37 12 57 86 33 92 25 48 37 12 57 86 33 92 25 48 37 12 57 86 33 92 25 48 37 12 57 86 33 92 25 48 37 12 57 86 33 92 25 48 37 12 57 86 33 92 25 48 37 12 57 86 33 92 25 12 37 48 57 86 33 92 25 12 37 48 57 86 33 92
v[1]>25, a=1
25 12 37 48 57 86 33 92 a=2, pois todos v[2]>25 25 12 37 48 57 86 33 92 b=1, pois v[1]<25 (ndices cruzaram)! 12 25 37 48 57 86 33 92 12 25 37 48 57 86 33 92 12 25 37 48 57 86 33 92, a=1, no vetor que comea em 37 12 25 37 48 57 86 33 92, b=4, no vetor que comea em 37 12 25 37 33 57 86 48 92, faz a troca, a=2 12 25 37 33 57 86 48 92, b=1 (b<a)! 12 25 33 37 57 86 48 92, troca v[0] por v[b]
23/10/09 (c) Dept. Informtica - PUC-Rio 16
Ordenao Rpida
! vetor inteiro de v[0] a v[7] (0-7) 25 48 37 12 57 86 33 92 ! determine a posio correta de x=v[0]=25
! de a=1 para o fim: 48>25 (a=1) ! de b=7 para o incio: 25<92, 25<33, 25<86, 25<57 e 12<=25 (b=3)!
(0-7) 25 48 37 12 57 86 33 92 a! b!"
a,b!"
17
Ordenao Rpida
! configurao atual do vetor: (0-7) 25 12 37 48 57 86 33 92 a,b!" ! determine a posio correta de x=v[0]=25
! de a=2 para o final: ! de b=2 para o incio: 37>25 (a=2)! 37>25 e 12<=25 (b=1)!
! !
troque o piv v[0]=25 com v[b]=12, o ltimo dos valores menores que 25 encontrado nova configurao do vetor, com o piv 25 na posio correta: (0-7) 12 25 37 48 57 86 33 92
23/10/09
18
Ordenao Rpida
! dois vetores menores para ordenar:
! valores menores que 25:
(0-0) 12
! vetor j est ordenado pois possui apenas um elemento
(2-7) 37 48 57 86 33 92
! vetor pode ser ordenado de forma semelhante, com 37 como piv
23/10/09
19
void rapida (int n, int* v){ if (n > 1) { int x = v[0]; int a = 1; int b = n-1; do { while (a < n && v[a] <= x) a++; /* teste a<n */ while (v[b] > x) b--; /* nao testa */ if (a < b) { /* faz troca */ int temp = v[a]; v[a] = v[b]; v[b] = temp; a++; b--; } } while (a <= b); /* troca piv */ v[0] = v[b]; v[b] = x; /* ordena sub-vetores restantes */ rapida(b,v); rapida(n-a,&v[a]); } }
23/10/09 (c) Dept. Informtica - PUC-Rio 20
Resumo
! Bubble sort
! quando dois elementos esto fora de ordem, troque-os de posio at que o i-simo elemento de maior valor do vetor seja levado para as posies finais do vetor ! continue o processo at que todo o vetor esteja ordenado
! Quick sort
! coloque um elemento arbitrrio x, o piv, em sua posio k ! chame recursivamente o algoritmo para ordenar os (sub-)vetores v[0], v[k1] e v[k+1], , v[n1] ! continue at que os vetores que devem ser ordenados tenham 0 ou 1 elemento
23/10/09
21
Referncias
Waldemar Celes, Renato Cerqueira, Jos Lucas Rangel, Introduo a Estruturas de Dados, Editora Campus (2004)! Captulo 16 Ordenao
23/10/09
22