Salve,
A página Ordenação: algoritmo Quicksort do prof. Paulo Feofiloff tem vários exercícios legais.
Sugiro que você façam pelo menos os exercícios:
- 2: um algoritmo O(n2) é fácil, seria legal uma solução linear;
- 4, 5: análise do comportamento da função separa()
- 6: sobre algoritmos de ordenação estáveis
- 10: a função separa() desse exercício é essencialmente a utilizada no qsort.c que eu mostrei na aula e reponsável pelo comentário:
Extraído do qsort.c da glibc: /* Here's the famous ``collapse the walls'' section of quicksort. Gotta like those tight inner loops! They are the main reaso that this algorithm runs much faster than others. */
Simulando um pouco é fácil ver a razão da metáfora "collapse the walls".
Veja também a função separa() da página do prof. Paulo que é creditada aD. Gries [The Science of Programming, 1981, pag.345]
- 17(!): quicksort com recursão de cauda (tail recursion).
Além desses exercício leiam a seção "Quicksort: altura da pilha de execução". O que está descrito nessa seção é responsável pelo comentário a seguir
Extraído do qsort.c da glibc: /* Order size using quicksort. This implementation incorporates four optimizations discussed in Sedgewick: [. . .] 4. The larger of the two sub-partitions is always pushed onto the stack first, with the algorithm then concentrating on the smaller partition. This *guarantees* no more than log (total_elems) stack size is needed (actually O(1) in this case)! */
Vejam também o exercício 23 da pagína do prof. Paulo:
23. Familiarize-se com a função qsort da biblioteca stdlib.
No link que está no stdlib o prof Paulo da uma explicação bem legal sobre como utilizar a função qsort() da biblioteca do C.
Finalmente, para os interessado, coloquei uma cópia do qsort.c junto com as notas de aula, mas o conteúdo desse arquivo também pode ser visto, por exemplo, na página
http://www.cs.umaine.edu/~chaw/200801/capstone/n/qsort.c.html