Я выполняю рандомизированный быстрый сортировку. На данный момент я создал функцию ChoosePivot(A,N)
. Это возвращает случайный стержень и его местоположение во входном массиве. Затем я переключаю этот случайный стержень с первым элементом в массиве, так что поворот в Partition (A,l,r)
всегда является первым элементом. Для Now ChoosePivot(A,N)
также возвращает первый элемент массива, но я планирую изменить его позже.
Ниже приведен мой код:
def QuickSort(A,N):
if (N == 1):
return
pivot, pivot_pos = ChoosePivot(A,N)
l = 0
r = len(A)
# Preprocessing, swapping pivot position with first element so that first element remains pivot always
temp = A[0]
A[0] = A[pivot_pos]
A[pivot_pos] = temp
A, i= Partition(A,l,r)
print A,i
# If i-1 == 0 this means that there is no left subarray
if (i-1 != 0):
print "Unsorted array"
print A[0:i-1]
QuickSort(A[0:i-1],i-1)
print "Left call"
print A
if (N-i !=0):
print "Unsorted array"
print A[i:N]
QuickSort (A[i:N], N-i)
print "Right call"
print A
Следующим является мой Partition(A,l,r)
def Partition(A,l,r):
# Now first element is the pivot
i= l + 1
pivot = A[l]
for j in range(l+1, r):
if (A[j] < pivot):
#swap (A[j], A[i])
temp_1 = A[i]
A[i] = A[j]
A[j] = temp_1
i = i+1
#swap (A[i-1], A[l])
temp_2 = A[i-1]
A[i-1] = A[l]
A[l] = temp_2
return A, i
ChoosePivot(A,N)
Просто возвращает первый элемент в массиве
def ChoosePivot(A, N):
#print A
return A[0], 0
Входной массив, который я использовал, выглядит следующим образом:
Test_in = [3,8,2,5,1,4,7,6]
print Test_in
QuickSort(Test_in, len(Test_in))
print Test_in
Посмотрите, что я вижу код, работающий на нижнем конце рекурсии. Я сделал сухой код запуска с ручкой и бумагой, и я могу видеть с заявлениями о печати, что он сортирует вспомогательные массивы, но когда массив возвращается, он не изменился. Я думал, что это что-то связанное с вызовом ссылки value vs, но я обнаружил, что python вызывает по ссылке. Поэтому там не должно быть никаких проблем. Проводка вывода также и указание, где именно она пошла не так.
Я нашел ошибку. Проблема в том, что когда я снова вызываю QuickSort
, я нарезаю исходный список и передаю его в качестве аргумента. Когда список нарезается, python создает новый список и копирует нарезанный список в новый список с тем же именем. Все изменения происходят в новом списке в глубине рекурсии, поэтому они не отражаются обратно. В качестве решения я передал весь массив и передал индексы списка в качестве аргументов массиву.
Еще одна ошибка. Условие перед вызовом QuickSort
которое является i-1!=0
и Ni!=0
, неверно, так как pivot может быть любым индексом в массиве. Я создал отдельные левый и правый индексы для левого и правого подмассивов и проверял left_index < right_index
.
Спасибо