Я работаю над назначением алгоритмов, которое требует, чтобы я показывал ход алгоритма быстрой сортировки с массивом равных элементов (1 (a), 1 (b), 1 (c) и т. д.), причем ось является последним элементом массива. Рекурсивная часть алгоритма - это то, что меня смущает. До сих пор я прогрессию:Прогрессия алгоритма быстрой сортировки с равными элементами
1(a) 1(b) 1(c) 1(d) [1(e)]
1(a) | 1(b) 1(c) 1(d) 1(e)
1(a) 1(b) | 1(c) 1(d) 1(e)
1(a) 1(b) 1(c) | 1(d) 1(e)
1(a) 1(b) 1(c) 1(d) | 1(e)
После этого поворота стал бы 1 (г) Я думаю, и прогрессия будет таким же, как описано выше, за исключением одного меньше обмена. Я смущен тем, как работают левые и правые рекурсивные вызовы. Могут ли элементы в «правой» части массива обмениваться с самими собой? В какой момент этот алгоритм остановится?
Вот псевдокод:
QS(A, p, r):
if p < r
q = PARTITION(A, p, r)
QS(A, p, q - 1)
QS(A, q + 1, r)
PARTITION(A, p, r):
x = A[r]
i = p - 1
for j = p to r - 1
if A[j] <= x
i = i + 1
exchange A[i] with A[j]
exchange A[i + 1] with A[r]
return i + 1
р является первым элементом массива и г является последним элементом.
Благодарим за помощь.
ваш вопрос непонятный. вы не показываете псевдокод. –
Моя ошибка. Просто добавил! – tfreiner
Вот некоторые объяснения, которые могут помочь: [быстрый сортировать с повторяющимися элементами] (http://stackoverflow.com/questions/13339227/quick-sort-algorithm-improvement-if-more-duplicate-keys). – Crocode