Quicksort Algoritmos e Estruturas de Dados II
História Proposto por Hoare em 960 e publicado em 962 É o algoritmo de ordeação itera mais rápido que se cohece para uma ampla variedade de situações Provavelmete é o mais utilizado 2
Algoritmo Dividir o problema de ordear um cojuto com ites em dois problemas meores Os problemas meores são ordeados idepedetemete As partições são combiadas para produzir a solução fial 3
Particioameto A parte mais delicada do quicksort é o processo de partição O vetor v é rearrajado por meio da escolha arbitrária de um pivô p O vetor v é particioado em dois: Partição esquerda: chaves p Partição direita: chaves p 4
Algoritmo para particioameto Escolha arbitrariamete o pivô p Percorra a partir da esquerda até que v[e] p Percorra a partir da direita até que v[d] p Troque v[e] com v[d] Repita os passos ateriores até que e e d se cruzarem d < e 5
Exemplo de particioameto Selecioado o pivô como v[de/2] C A M I N H O C A M I N H O C A M I N H O C A M I N H O C A M I N H O C A H I N M O C A H I N M O Ao fial do particioameto 6 O pivô está em sua posição fial Elemetos a partição da esquerda são meores Elemetos a partição da direita são maiores que o pivô
Exemplo quicksort C A H I N M O C A H I C A H I N H O C A H I N H O A C H I N H O A C H I N H O A C H I N M O A C H I N M O A C H I N M O N M O N M O M N O M N O A C H I M N O 7
Quicksort void quicksortstruct item *v, it e, it d { ifd <= e retur; it p = particaov, e, d; quicksortv, e, p-; quicksortv, p, d; } void particaostruct item *v, it e, it d { it i = e; it j = d; struct item pivo = v[de/2]; while { whilev[i].chave < pivo.chave i; whilepivo.chave < v[j].chave j--; ifi >= j break; trocav[i], v[j]; i; j--; } 8 } trocav[i], v[d]; retur i; Não fucioa quado tem elemetos repetidos!
Quicksort Aálise Pior caso Acotece quado o pivô é sempre o maior ou meor elemeto partições de tamaho desequilibrado void quicksortstruct item *v, it e, it d { ifd <= e retur; it p = particaov, e, d; /* p = d; */ quicksortv, e, p-; /* quicksortv, e, d-; */ quicksortv, p, d; /* quicksortv, d, d; */ } comparações 9 - comparações zero comparações C = 2 L = i = i= 2
Quicksort Aálise Exemplo de pior caso T V Y Z S X U T V Y U S X Z T V X U S Y Z T V S U X Y Z T U S V X Y Z T S U V X Y Z S T U V X Y Z 0
Quicksort Aálise Melhor caso Acotece quado as partições têm sempre o mesmo tamaho partições balaceadas void quicksortstruct item *v, it e, it d { ifd <= e retur; it p = particaov, e, d; /* p = de/2; */ quicksortv, e, p-; /* quicksortv, e, de/2-; */ quicksortv, p, d; /* quicksortv, de/2, d; */ } comparações /2 comparações /2 comparações C = 2C / 2 lg
Quicksort Aálise Caso médio Partições podem ser feitas em qualquer posição o vetor = = = i i C i C i C C 2 2 = = i i C 2 2 = C C C C C lg, l 39 2 2 = =
Quicksort Aálise Melhor caso C lg = O lg Caso médio C, 39lg = O lg Pior caso C = = 2 O 2 3
Vatages e desvatages Vatages: Melhor opção para ordear vetores grades Muito rápido por que o laço itero é simples Memória auxiliar para a pilha de recursão é pequea Complexidade o caso médio é O lg Desvatages: Não é estável ão cohecemos forma eficiete para torar o quicksort estável Pior caso é quadrático 4
Otimização Mediaa de três Para evitar o pior caso do quicksort, podemos escolher o pivô como a mediaa de três elemetos T V Y Z S X U T V Y Z S X U T S U Z Y X V Aumetar o úmero de elemetos cosiderados a mediaa, por exemplo pra 5 ou 9, ão ajuda muito 5
Otimização Partição meor primeiro Implemetações ão recursivas do quicksort precisam mater uma pilha auxiliar No pior caso, a pilha auxiliar pode ter tamaho Para limitar o crescimeto da pilha auxiliar basta ordear a partição meor primeiro T V Y Z S X U T V Y Z S X U T S U Z Y X V T S U 6
Otimização Partições pequeas Quado a partição a ordear é pequea, o método de ordeação por iserção é mais rápido que o quicksort Não tem chamadas recursivas Laço itero muito eficiete T V Y Z S X U T V Y Z S X U T S U Z Y X V T S U 7
Potos extras poto para os três primeiros aluos que apresetarem código do quicksort que usa mediaa de três poto para os três primeiros aluos que apresetarem código do quicksort que usa iserção em partições pequeas poto para os três primeiros aluos que apresetarem quicksort ão recursivo e que limita o tamaho da pilha auxiliar ordeado partições pequeas primeiro Cada aluo pode gahar apeas dos potos acima A solução deve ser costrúída como extesão do código colocado a págia do curso 8