我正在尝试编写快速排序功能 这是我的代码
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)
但是我得到了一个空列表...我在这里缺少什么?
答案 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
鉴于您如何进行分区,就地版本可能更有意义。如果与分区方案配对使其成为一个稳定的排序(在现场进行稳定的快速排序并不容易),那么另一个版本会更有趣。