python中的快速排序实现

时间:2016-08-03 00:07:52

标签: algorithm python-2.7 sorting

我正在尝试编写快速排序功能 这是我的代码

def quick_sort(ar):
    if len(ar) < 2:
        return ar
    pivot = ar[-1]
    i = 0

    for j in range(len(ar)):
        if ar[j] < pivot:
            ar[i], ar[j] = ar[j] , ar[i]
            i += 1
    ar[i], ar[-1] = ar[-1], ar[i]

    quick_sort(ar[0:i])
    quick_sort(ar[i+1:])

    return ar


lst = [1, 3, 9, 8, 2, 7, 5]
print quick_sort(lst)

但是我得到了一个空列表...我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

您正在对列表的切片进行递归调用。切片会生成副本,因此递归根本不会更改原始列表。您需要使用递归调用的返回值,或者您应该就地执行所有操作。其中每一项都需要对代码进行一些更改,只需在不同的地方进行更改

以下是构建新列表的代码版本:

def quick_sort(ar):
    if len(ar) < 2:
        return ar
    pivot = ar[-1]
    i = 0

    for j in range(len(ar)):
        if ar[j] < pivot:
            ar[i], ar[j] = ar[j] , ar[i]
            i += 1
    ar[i], ar[-1] = ar[-1], ar[i]

    result = quick_sort(ar[0:i]) # build a new result list from the recursive calls
    result.append(pivot)
    result.extend(quick_sort(ar[i+1:]))

    return result

这是一个就地排序的人:

def quick_sort(ar, low=0, high=None):   # get sorting bounds as arguments
    if high is None:
        high = len(ar)
    if high - low < 2:
        return
    pivot = ar[high-1]
    i = low

    for j in range(low, high):   # iterate on a limited range
        if ar[j] < pivot:
            ar[i], ar[j] = ar[j] , ar[i]
            i += 1
    ar[i], ar[high-1] = ar[high-1], ar[i]

    quick_sort(ar, low, i)
    quick_sort(ar, i+1, high)

    # no need to return anything, since we sorted ar in place

鉴于您如何进行分区,就地版本可能更有意义。如果与分区方案配对使其成为一个稳定的排序(在现场进行稳定的快速排序并不容易),那么另一个版本会更有趣。