我正在尝试使用就地排序在python中编写quicksort代码。我的代码在子数组中工作得很好但是它似乎无法将子数组粘在一起以形成最终的排序数组。
def quickSort (ar):
if len(ar)>1:
pivot = ar[-1]
wall = 0
for i in range(len(ar)-2):
if ar[i] <= pivot:
ar[wall], ar[i] = ar[i], ar[wall]
wall += 1
ar[wall], ar[-1] = ar[-1], ar[wall]
quickSort (ar[:wall])
quickSort (ar[wall+1:])
答案 0 :(得分:2)
您的代码正在尝试就地排序 - 但是它会将切片副本传递给递归调用,因此您只需将这些副本就地排序然后丢弃它们。
(如果不清楚:切换列表总是复制列表。更复杂的类型 - 如memoryview
或np.array
- 可能会支持&#34 ;共享视图&#34;在其结构的一部分,但列表是故意简单。)
解决此问题的一种方法是更改为复制而非就地排序,这可以以下结尾:
return quickSort(ar[:wall]) + ar[wall] + quickSort(ar[wall+1:])
(当然你还需要更改上面的普通代码来构建副本而不是就地改组。)
另一种方法是通过传递列表本身并切片索引而不是列表的切片副本来继续就地执行:
def quickSort(ar, start=None, stop=None):
if start is None: start = 0
if stop is None: stop = len(ar)
pivot = ar[stop-1]
for i in range(start, (stop-start)-2):
# and so on
quickSort(ar, start, wall)
quickSort(ar, wall+1, stop)
确保你选择其中一种 - 一种部分就地,部分复制和组装是一团糟。