Когда в сортируемом массиве имеется множество повторяющихся ключей предыдущие реализации быстрой сортировки можно существенно улучшить. Например массив, который состоит из равных ключей, вовсе не нуждается в дальнейшей сортировке, однако предыдущие реализации продолжают процесс разделения, подвергая обработке все более мелкие подмассивы, независимо от того, насколько большим является исходный файл.
[[Файл:G3.png |400px|thumb|center|Разделение массива <tex> a </tex>]]
В основу программы положено разделение массива на три части:
После этого сортировка завершается двумя рекурсивными вызовами.
Просмотр массива начинается слева с целью обнаружить элементЧтобы достичь поставленной цели, программа содержит ключи, который не меньше разделяющего элементаравные разделяю- щему элементу, слева между l и p и справа с целью обнаружить элементмежду q и г. В разделяющем цикле, который не больше разделяющего элементакогда указатели просмотра перестают изменяться и выполняется обмен значениями i и j, затем они меняются местамиона проверяет каждый из этих элементов на предмет равенства разделяюще- му элементу. Если после обмена элемент , который сейчас находится слева , равен разделяющему элементу, то при помощи операции обмена он меняется местами с левымпомещается в левую часть масси- крайним элементом массивава; если элемент, который сейчас находится справа, равен разделяющему элементу, то же самое проделывается и справав результате операции обмена он помещается в правую часть массива. После того как указатели пересекутся, элементы, равные разделяющему элементу и находящиеся на разных концах массива, после операции обмена попадают в свои окончательные позиции. После этого указанные ключи могут быть исключены из подмассивов, для которых выполняются последующие рекурсивные вызовы.
'''void''' quicksort(a: '''T'''[n], '''int''' l, '''int''' r)