【问题标题】:Randomize quick sort in python, recursion issuepython中的随机快速排序,递归问题
【发布时间】:2018-12-01 14:35:08
【问题描述】:

我正在实施随机快速排序。现在我已经创建了一个函数ChoosePivot(A,N)。这将返回一个随机枢轴及其在输入数组中的位置。然后我用数组中的第一个元素切换该随机枢轴,以便Partition (A,l,r) 中的枢轴始终是第一个元素。现在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 

请注意,我可以看到代码在递归的低端工作。我用笔和纸做了试运行代码,我可以通过打印语句看到它确实对子数组进行了排序,但是当数组最终返回时,它并没有改变。我认为它与值与引用调用有关,但我发现 python 通过引用调用。所以那里应该没有任何问题。 同时发布输出并指出错误的确切位置。

【问题讨论】:

  • 请不要提供图片链接,请在您的问题中发布问题的文字。
  • 我不打算发布链接。我拍摄了控制台的图像并准确指出代码有问题的地方,但除非我有一些观点,否则不允许我发布图像。所以它自己发布了链接
  • 不要。将图像中的文本复制并粘贴到您的问题中。原因是我们不能这样做,并且要重现您的问题,我们必须自己输入所有内容。您设置的障碍越多,任何人尝试提供帮助的可能性就越小。
  • 对不起,让我澄清一下。这张图片没有人需要输入。如果有人运行代码。这将被输出。我发布的图片,以防万一有人甚至不需要运行代码并且可以指出为什么会发生这种情况。

标签: python function parameter-passing pass-by-reference quicksort


【解决方案1】:

我发现了错误。 问题是当我再次调用QuickSort 时,我将原始列表切片并将其作为参数传递。当列表被切片时,python会创建一个新列表并将切片列表复制到具有相同名称的新列表中。所有更改都发生在递归深处的新列表中,因此它们不会反映回顶部。 作为解决方案,我传递了整个数组并将列表索引作为参数传递给数组。

还有另一个错误。调用QuickSort 之前的条件i-1!=0N-i!=0 不正确,因为枢轴可以是数组中的任何索引。我为左右子数组创建了单独的左右索引并测试了left_index &lt; right_index

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2013-01-29
    • 2020-08-14
    • 2021-06-26
    • 2013-10-08
    相关资源
    最近更新 更多