Рандомизация быстрой сортировки в python, проблема рекурсии

1

Я выполняю рандомизированный быстрый сортировку. На данный момент я создал функцию 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 вызывает по ссылке. Поэтому там не должно быть никаких проблем. Проводка вывода также и указание, где именно она пошла не так.

Изображение 174551

Теги:
function
parameter-passing
quicksort
pass-by-reference

1 ответ

0
Лучший ответ

Я нашел ошибку. Проблема в том, что когда я снова вызываю QuickSort, я нарезаю исходный список и передаю его в качестве аргумента. Когда список нарезается, python создает новый список и копирует нарезанный список в новый список с тем же именем. Все изменения происходят в новом списке в глубине рекурсии, поэтому они не отражаются обратно. В качестве решения я передал весь массив и передал индексы списка в качестве аргументов массиву.

Еще одна ошибка. Условие перед вызовом QuickSort которое является i-1!=0 и Ni!=0, неверно, так как pivot может быть любым индексом в массиве. Я создал отдельные левый и правый индексы для левого и правого подмассивов и проверял left_index < right_index.

Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню