Documente Academic
Documente Profesional
Documente Cultură
Exemplo:
#include int main(void) { int i, j,v[100], n, temp; for (i = n - 1; i > 0; i--) for (j = 0; j < i; j++) if (v[j] > v[j+1]) { temp = v[j]; v[j] = v[j+1; v[j+1 = temp; } return 0; }
O Mtodo da Bolha Melhorado o prprio mtodo bolha, mas com algumas alteraes. Esse mtodo finalizado quando nenhuma alterao foi feita aps uma passada no vetor, diminuindo o tempo de consumo do algoritmo.
Exemplo:
#include int main(void) { int i, j, v[100], n, temp, troca; troca = 1; for (i= n-1; (i >= 1) && (troca == 1); i--) { troca = 0; for (j= 0; j < i ;j++) { if (v[j] < v[j+1]) { temp = v[j]; v[j] = v[j+1]; v[j+1] = temp; troca = 1; } } } return 0; }
A ideia bsica do Quicksort partir o problema de ordenar um conjunto com n itens em dois problemas menores. Depois de dividir o problema, os problemas menores so ordenados independentemente e depois os resultados so combinados para produzir a soluo do problema maior. A parte mais delicada desse mtodo se refere diviso da partio. Deve-se rearranjar o vetor na forma A[Esq..Dir] atravs da escolha arbitrria de um item x do vetor chamado piv, de tal forma que ao final o vetor A est particionado em uma parte esquerda com chaves menores ou iguais a x e uma parte direita com chaves maiores ou iguais a x. O Procedimento do Algoritmo Quicksort se d da seguinte forma: 1. Escolher arbitrariamente um item do vetor e colocar este valor em x; 2. Percorrer o vetor a partir da esquerda at que um item A[i] x encontrado; da mesma maneira, percorrer o vetor a partir da direita at que um item A[j] x encontrado; 3. Como os itens A[i] e A[j] no esto na ordem correta no vetor final, eles devem ser trocados; 4. Continuar o processo at que os ndices i e j se cruzem em algum ponto do vetor.
>> Os itens em A[Esq], A[Esq+1], ... , A[j] so menores ou iguais a x. >> Os itens A[i], A[i+1], ... , A[Dir] so maiores o iguais a x.
O mtodo ilustrado para o conjunto de seis chaves apresentado na figura abaixo. O item x escolhido como sendo A[(i+j)div2]. Como inicialmente i = 1 e j = 6, ento x = A[3] = D, o qual aparece em destaque na segunda linha da mesma figura. A varredura a partir da posio 1 pra no item O e a varredura a partir da posio 6 pra no item A, sendo os dois itens trocados, como mostrado na terceira linha da figura. A seguir, a varredura a partir da posio 2 pra no item R e a varredura a partir da posio 5 pra no item D, e ento os dois itens so trocados, como mostrado na quarta linha. Neste momento i e j se cruzam (i = 3 e j = 2), o que encerra o processo de partio. 1 2 3 4 5 6
O A A
R R D
D D R
E E E
N N N
A O O
Feito este procedimento, o algoritmo agora ter de fazer a ordenao, ou seja, o refinamento final do procedimento Quicksort. Veja o exemplo de ordenao usando o Quicksort:
Chaves iniciais
A A
D D
R N
N R O
O O R R
procedure Particao (Esq, Dir: ndice; var i, j : ndice); var piv, x: Item; begin i := Esq; j := Dir; piv := A[(i+j) div 2)]; repeat; while piv.Chave > A[i].Chave do i := i+1; while piv.Chave < A[j].Chave do j :=j-1; if i <= j then begin x := A[i]; A[i] := A[j]; A[j] :=x; i := i+1; j :=j-1; end; until i>j; end; Analisando a procedure:
>> Esq e Dir so ndices para definir os sub-vetores do vetor original A a ser particionado
>> i e j retornam as posies finais das parties, onde: > A[Esq], A[Esq+1],..., A[j] so menores ou iguais a x
Procedimento Quicksort:
procedure Quicksort (var A: Vetor); {-- Entra aqui o procedimento partio --} procedure Ordena (Esq, Dir : ndice); var i, j, ndice; begin partio (Esq, Dir, i, j); if Esq < j then Ordena (Esq, j); if i < Dir then Ordena (i, Dir); end; begin Ordena (1, n); end;
Uma caracterstica interessante do Quicksort a sua ineficincia para arquivos j ordenados quando a escolha do piv e inadequada. Por exemplo, a escolha sistemtica dos extremos de um arquivo j ordenado leva ao seu pior caso. O pior caso pode ser evitado atravs de pequenas modificaes no programa.
procedure Seleo (var A: Vetor); var i, j, Min : ndice; x begin for i := 1 to n-1 do begin Min i := i; for j := i+1 to n do if A [j].Chave < A[Min].Chave then Min := j; x := A[Min]; A[Min] := A[i]; A[i] := x; end; end; : Item;