CP Teoria Ordenacao Parte2 2 C pia
2010 palavras
9 páginas
CLASSIFICAÇÃO E PESQUISAMÉTODOS DE ORDENAÇÃO
PARTE II
PLT PAG. 95
Prof. Juliana Santiago Teixeira juliana.santiago@pitagoras.com.br QUICKSORT
Proposto por Hoare em 1960 e publiccado em
1962
É o algoritmo de ordenação interna mais rápido que se conhece para uma ampla variedade de situações Provavelmente é o mais utilizado
QUICKSORT
A idéia básica é dividir o problema de ordenar um conjunto com n itens em dois problemas menores Os problemas menores são ordenados independentemente Os resultados são combinados para produzir a solução final
QUICKSORT
A parte mais delicada do método é o processo de partição
O vetor A[Esq..Dir] é rearranjado por meio da escolha arbitrária de um pivô x
O vetor A é particionado em duas partes:
A parte esquerda com chaves menores ou iguais a x
A parte direita com chaves maiores ou iguais a x
QUICKSORT
Algoritmo para o particionamento:
1. Escolha arbitrariamente um pivô x
2. Percorra o vetor a partir da esquerda até que
A[i] ≥ x
3. Percorra o vetor a partir da direita até que
A[j] ≤ x
4. Troque A[i] com A[j]
5. Continue este processo até os apontadores i e j se cruzarem QUICKSORT
Ao final, o vetor A[Esq..Dir] está particionado de tal forma que:
Os itens em A[Esq]; A[Esq + 1]; ... ; A[j] são menores ou iguais a x
Os itens em A[i]; A[i + 1]; ... ; A[Dir] são maiores ou iguais a x
QUICKSORT
QUICKSORT
O pivô x é escolhido como sendo
A[(i + j)/2]
Como inicialmente i = 1 e j = 6, então x = A[3] = D
Ao final do processo de partição i e j se cruzam em i = 3 e j = 2
void particao(ITEM a[], int esq, int dir, int *i, int *j)
{
ITEM x, w;
*i = esq; *j = dir; x = a[(*i+*j)/2]; do { while (x.chave > a[*i].chave) (*i)++; while (x.chave < a[*j].chave) (*j)--; if (*i<=*j){
w = a[*i]; a[*i] = a[*j]; a[*j] =w;
(*i)++; (*j)--;
}
} while (*i<=*j);
}
// particao
void ordena(ITEM a[], int esq, int dir)
{
int i, j; particao(a, esq, dir, &i, &j); if (esq < j)
ordena(a, esq, j); if (i < dir)
ordena(a,