Я новичок в алгоритмах, и я смущен относительно того, где ошибки в моем коде, которые я пишу как назначение. Я пытаюсь реализовать алгоритм быстрой сортировки в Python 3, который имеет дело с равными значениями в массиве.Реализация 3-way quicksort
Вот функция быстрой сортировки (а обозначает массив):
def randomized_quick_sort(a, l, r):
if l >= r:
return
k = random.randint(l, r)
a[l], a[k] = a[k], a[l]
m1, m2 = partition3(a, l, r)
randomized_quick_sort(a, l, m1 - 1);
randomized_quick_sort(a, m2 + 1, r);
И вот моя статсумма:
def partition3(a, l, r):
x, j, t = a[l], l, r
for i in range(l + 1, r + 1):
if a[i] < x:
j +=1
a[i], a[j] = a[j], a[i]
elif a[i] > x:
a[i], a[t] = a[t], a[i]
t -=1
else:
j +=1
a[l], a[j] = a[j], a[l]
return j, t
Я бы порекомендовал заменить «3-way» на «stable» в названии или полностью удалить его. Все виды принципиально меньше, равны, больше. Некоторые алгоритмы сортировки поддерживают порядок элементов, когда элементы равны, которые называются «стабильными» реализациями сортировки. 3-way заставляет меня думать о 3-way diffing или сортировать 3 отдельных списка в более эффективной реализации, чем объединять 3 списка в один список и сортировать их. – IceArdor
@ IceArdor: Я уверен, что Elen ссылается на 3-way _partitioning_ («проблема голландского национального флага» (https://en.wikipedia.org/wiki/Dutch_national_flag_problem) »). Из Википедии: «В частности, варианты алгоритма [quicksort] (https://en.wikipedia.org/wiki/Quicksort), которые должны быть надежными для повторяющихся элементов, нуждаются в трехсторонней функции секционирования, которая группирует элементы, (красный), равный ключу (белый) и больше, чем ключ (синий). " –