我正在尝试在python中实现quicksort:
def partition(ls):
if len(ls) == 0:
return 0
pivot = ls[0]
i = 0
j = 1
while j < len(ls):
if ls[j] <= pivot:
i += 1
temp = ls[i]
ls[i] = ls[j]
ls[j] = temp
j += 1
ls[0] = ls[i]
ls[i] = pivot
return i
assert(partition([1,2]) == 0)
assert(partition([3,2]) == 1)
assert(partition([3,2,1,4,5]) == 2)
assert(partition([]) == 0)
assert(partition([45]) == 0)
def sort(ls):
if len(ls) == 0:
return
pivotIndex = partition(ls)
sort(ls[0:pivotIndex])
sort(ls[(pivotIndex + 1):len(ls)])
ls = [54,1,3,2,4,3,5,4]
sort(ls)
print ls
基于我的断言语句,我知道我的分区算法工作正常。
但是,我的sort函数会返回错误的结果。这段代码打印
[4, 1, 3, 2, 4, 3, 5, 54]
递归调用的界限应该是什么?我的目标是将子列表分区到枢轴的左侧,将子列表分区到枢轴的右侧,两者都不包括枢轴本身。
答案 0 :(得分:0)
sort(ls[0:pivotIndex])
sort(ls[(pivotIndex + 1):len(ls)])
切片会复制列表的一部分,因此在递归调用中,您不会修改原始列表。因此,只有第一个partition
修改了列表。
答案 1 :(得分:0)
Python中的一些已知良好的排序和可选的Cython,包括Quicksort。 BTW,查看性能比较;你可能会发现Quicksort没有内置的Timsort那么有吸引力: http://stromberg.dnsalias.org/~strombrg/sort-comparison/