You are on page 1of 6

Quick Sort

Rogrio Arajo, Rafael Arajo, Weusder Monteiro

O algoritmo Quicksort um mtodo de ordenao muito rpido e eficiente, inventado por Hoare em 1960, quando visitou a Universidade de Moscovo como estudante. Naquela poca, Hoare trabalhou em um projeto de traduo de mquina para o National Physical Laboratory. Ele criou o Quicksort ao tentar traduzir um dicionrio de ingls para russo, ordenando as palavras, tendo como objetivo reduzir o problema original em subproblemas que possam ser resolvidos mais fcil e rapidamente. Foi publicado em 1962 aps uma srie de refinamentos.[2] O Quicksort um algoritmo de ordenao por comparao no-estvel. O Quick Sort um dos mtodo mais rpidos de ordenao, apesar de s vezes parties desequilibradas poderem conduzir a uma ordenao lenta. Esse mtodo de ordenao utiliza a tcnica divide and conquer (dividir o problema inicial em dois subproblemas e resolver um problema menor utilizando a recursividade)

Este mtodo baseia-se na diviso da tabela em duas sub-tabelas, dependendo de um elemento chamado piv, normalmente o 1 elemento da tabela. Uma das subtabelas contm os elementos menores que o piv enquanto a outra contm os maiores. O piv colocado entre ambas, ficando na posio correta. As duas sub-tabelas so ordenadas de forma idntica, at que se chegue tabela com um s elemento. Complexidade: caso mdio O(N * log N) Esse mtodo de ordenao divide-se em vrios passos: Escolher para piv o primeiro elemento da tabela (p=x[1]) Se os elementos de x forem rearranjados de forma a que o piv (p) sejam colocados na posio j e sejam respeitadas as seguintes condies: 1. todos os elementos entre as posies 1 e j-1 so menores ou iguais que o piv (p) 2. todos os elementos entre as posies j+1 e n so maiores que o piv (p) Ento p permanecer na posio j no final do ordenamento. Se este processo for repetido para as sub-tabelas x[1] a x[j-1] e x[j+1] a x[n] e para todas as sub-tabelas criadas nas iteraes seguintes obteremos no final uma tabela ordenada.

Portanto a parte mais difcil deste mtodo o procedimento parte que divide a tabela em 2 sub-tabelas dependendo do piv.

Algoritmo de Ordenao

1. 2.

Caso bsico: Se o nmero de elementos a ordenar for 0 ou 1 ento terminar Seleccionar o elemento Piv P: Escolhendo um elemento qualquer entre os elementos a ordenar Processo de partio: Dividir os elementos em 2 subconjuntos disjuntivos na qual: m= (x vector - (P) | x P) M= (x vector - (P) | x > P) //elementos inferiores ao piv //elementos superiores ao piv

3.

4.

Mtodo recursivo: Ordenar os subconjuntos esquerdo e direito, usando o mesmo mtodo recursivamente.

Algoritmo de Escolha de Piv Mtodo Simples: Usar sempre o primeiro elemento da parte do array/vector que est sendo ordenado. Mtodo Melhor: Olhar para trs elementos diferentes, e usar o elemento mdio entre os trs.

Algoritmo de Partio O procedimento de partio deve reorganizar os elementos de forma a que: 1. 2. Escolha do piv: Considere p=a[lim_inferior] como o elemento piv Usa-se o primeiro elemento para facilitar a implementao.

Dois ponteiros alto e baixo so inicializados como os limites superior e inferior do array/vector a ordenar Em qualquer ponto de execuo, todos os elementos acima de alto maior do que x e todo o elemento abaixo de baixo menor do que x.

3.

Os dois ponteiros alto e baixo so movidos um em direco ao outro da seguinte forma:

Incrementa baixo em uma posio enquanto que a[baixo] p. Decremente alto em uma posio enquanto que a[alto] > p. Se alto > baixo , troque a[baixo] por a[alto]. O processo repetido at que a condio descrita mais acima falhe (quando alto <= baixo ). Neste ponto a[alto]ser trocado por a[lim_Inferior],cuja posio final era procurada, e alto retornado em i.

Implementao:

public static void quick_sort(int []v,int ini, int fim){ int meio; if(ini<fim){ meio = partition(v,ini,fim); quick_sort(v,ini,meio); quick_sort(v,meio+1,fim); } } public static int partition(int []v, int ini, int fim){ int pivo, topo,i; pivo = v[ini]; topo = ini; for(i=ini+1;i<fim;i++){ if(v[i]<pivo){ v[topo]=v[i]; v[i]=v[topo+1]; topo++; } } v[topo]=pivo; return topo; }

Bibliografia

http://pt.wikipedia.org/wiki/Quicksort http://w3.ualg.pt/~hshah/ped/Aula%2014/Quick_final.html