我一直在努力实施类似2天的快速排序(看起来我的编程技巧正在变得生疏)。我不知道我做错了什么。我正要放弃,所以我想我应该咨询讨论论坛。
这是我试图在python中实现的代码。但它没有给出理想的结果。任何人都可以指出我做错了什么?
def QuickSort(A,p,r):
if p < r:
pivotIndex = Partition(A,p,r)
QuickSort(A,p,pivotIndex-1)
QuickSort(A,pivotIndex+1,r)
return A
def Partition(A,p,r):
m = A[p]
i = p+1
for j in range( p+1 , r ):
if A[j] < m:
A[j] , A[i] = A[i] , A[j]
i+=1
A[p], A[i-1] = A[i-1] , A[p]
return i-1
测试输入的输出是:
>>>QuickSort([9,8,7,6,5,4,3,2,1],0,9)
[1, 3, 5, 6, 7, 4, 8, 2, 9]
如果有人帮我实现这一点,我将非常感激。
此致
答案 0 :(得分:2)
切片不会返回原始列表的视图;它从旧列表中的数据中创建一个新列表。这意味着对QuickSort
的递归调用不会更改原始列表。
答案 1 :(得分:1)
您可以在一行代码中尝试此实现:
def QuickSort(list):
return [] if list==[] else QuickSort([x for x in list[1:] if x < list[0]]) + [list[0]] + QuickSort([x for x in list[1:] if x >= list[0]])
print QuickSort([9,8,7,6,5,4,3,2,1])
答案 2 :(得分:1)
我已经找到了答案。看来我正在向QuickSort方法传递一个
def QuickSort(A,p,r):
if r-p <= 1: return
pivotIndex = Partition(A,p,r)
QuickSort(A,p,pivotIndex)
QuickSort(A,pivotIndex+1,r)
return A
def Partition(A,p,r):
m = A[p]
i = p+1
for j in range( p+1 , r ):
if A[j] < m:
A[j] , A[i] = A[i] , A[j]
i= i + 1
A[p], A[i-1] = A[i-1] , A[p]
return i-1
这是正确的实施
答案 3 :(得分:0)
似乎你想保持左侧的枢轴并跳过它,但结果并不好,所以我只是将它移动到数组的末尾并相应地减少了迭代索引然后反转了分区后交换(考虑到枢轴运动)。
def Partition(A,p,r):
m = A[p]
A[p], A[r] = A[r], A[p]
i = p
for j in range( p, r ):
if A[j] < m:
A[j] , A[i] = A[i] , A[j]
i+=1
A[r], A[i] = A[i] , A[r]
return i
我认为你可以用左侧的枢轴来做,但是我想你必须改变循环方向,但我不确定。
编辑:抱歉,我忘了添加电话,然后是QuickSort([9,8,7,6,5,4,3,2,1],0, 8 ),因为指数现在是包容性的。