尝试使用python实现快速排序,但它不起作用

时间:2018-05-30 18:32:15

标签: python python-3.x algorithm sorting quicksort

我尝试使用python实现快速排序算法我认为我已经完成了正确的步骤,但似乎我的代码存在问题,每次运行代码时它都不起作用你能帮我找到我的代码问题吗?

def quicksort(alist,first,last):
    if first < last:
        split = partition(alist,first,last)

        quicksort(alist,first,split-1)
        quicksort(alist,split+1,last)



def partition(arr,first,last):

    pivot_val = arr[first]
    rightmark = first +1
    leftmark = last

    done = False

    while not done:

        while leftmark <= rightmark and arr[leftmark] <= pivot_val:
            leftmark +=1
        while arr[rightmark] >= pivot_val and rightmark >= leftmark:
            rightmark -=1

        if rightmark < leftmark:
            done = True
        else:
            tmp = arr[leftmark]
            arr[leftmark] = arr[rightmark]
            arr[rightmark] = tmp


    tmp = arr[rightmark]
    arr[rightmark] = arr[first]
    arr[first] = tmp

    return rightmark


lst = [22,54,33,11,87,76,1,3]

quicksort(lst,0,len(lst)-1)

print(lst)

输出如下:

[54, 22, 11, 33, 76, 87, 1, 3]

1 个答案:

答案 0 :(得分:0)

是的,通常的实现将pivot作为最后一个值而不是第一个,但这是无关紧要的。然而,错误是右标记和左标记的初始化。假设左标记是左边的&#39;即小于,且右标记大于,则左标记应初始化为第一个+ 1,右标记应初始化为最后一个。

这不是quicksort的正常实现,其分区函数simple通过数组线性循环(除了pivot)。这个巧妙地将左标记向右移动,直到第一个条目大于枢轴,然后将右标记向左移动,直到第一个条目小于枢轴。然后它交换这两个值直到它们交叉。这是最终条件。