好的,我已经编辑了我的代码,感谢下面的评论。但它仍然无法正常工作......请帮助。
编辑:
import random
def quickSort(A,start,size): # randomized version
if size<2:
return
pivot=A[int(random.choice(A[start:start+size])
L=start
U=L+size-1
while L<U:
while A[L]<pivot:
L+=1
while A[U]>pivot:
U-=1
A[L],A[U]=A[U],A[L]
quickSort(A,start,L)
quickSort(A,L+1,size-L-1)
A=[22,77,55,33,88,11]
quickSort(A,0,6)
print A
上一篇文章:
我在Python中实现了快速排序。以下是实施。但它没有正确排序。似乎原始数组A在某些步骤中不会受到递归的影响。
请帮忙。谢谢!
import random
def quickSort(A,size): # randomized version
if size<2:
return
pivot=A[int(random.uniform(0,size))%size]
L=0
U=size-1
while L<U:
while A[L]<pivot:
L+=1
while A[U]>pivot:
U-=1
A[L],A[U]=A[U],A[L]
quickSort(A,L)
quickSort(A[L:],size-L-1)
A=[33,50,18,2,66]
quickSort(A,5)
print A
答案 0 :(得分:0)
您对quickSort(A,0,L)
的号码在位置0
开始时已经硬编码,应该从start
开始,同一个地方L开始(L=start
)。
然后你的???可以start+size-1
就像U
开始的地方一样。
并调整random.uniform(..)
来电,因为它要求从位置开始的范围并以项目数结束 - 它会向后,例如从50开始到8 结束。这也需要start, start+size
。
答案 1 :(得分:0)
让我们引用Jon Bentley(“编程珍珠”,Addison-Wesley,1986,脚注第110页):
Quicksort的大多数演示都使用基于两个的分区方案 接近指数,....虽然该计划的基本思想是 简单,我总是发现细节棘手 - 我曾经花了 两天中最好的一部分追逐一个隐藏在短片中的bug 分区循环。初稿的读者抱怨说 标准的双指数法实际上比Lomuto的简单,并且 草拟了一些代码来说明他的观点;我找到了,我停止了照顾 两个错误。
您正在使用接近指数计划,不是吗?
这里是Nico Lomuto在其所有美景中的分区,以及一些测试
from random import randrange
def order(A, L, U):
p = randrange(L,U+1)
A[L], A[p] = A[p], A[L]
V = A[L]
print "# random value:", V
M = L
for K in range(L, U+1):
if A[K]<V:
M = M+1
A[M], A[K] = A[K], A[M]
A[L], A[M] = A[M], A[L]
return M
N = 20
for i in range(10):
l = [randrange(0,10) for _ in range(N)]
s = order(l,0,N-1)
print "#", l[:s], [l[s]], l[s+1:]
制造
# random value: 5
# [2, 3, 4, 1, 0, 1, 1, 4, 0, 4, 0, 1, 4] [5] [9, 5, 7, 6, 9, 9]
# random value: 2
# [0, 0, 0, 1, 1] [2] [7, 3, 2, 6, 5, 8, 7, 8, 4, 4, 3, 9, 8, 6]
# random value: 8
# [2, 5, 3, 1, 5, 4, 2, 2, 3, 5, 0, 6, 3, 2, 2] [8] [8, 9, 8, 9]
# random value: 5
# [1, 1, 1, 1, 0, 0, 4] [5] [7, 8, 9, 5, 9, 9, 9, 8, 9, 8, 7, 9]
# random value: 7
# [2, 0, 5, 2, 1, 4, 4, 4, 5, 3, 2, 1, 0, 4, 6, 5, 3] [7] [9, 9]
# random value: 4
# [2, 2, 1, 0, 3, 3, 3, 2, 2, 2, 3, 2] [4] [4, 4, 9, 9, 6, 6, 9]
# random value: 6
# [4, 2, 5, 5, 0, 1, 4, 3, 0, 0] [6] [9, 8, 9, 7, 8, 9, 6, 9, 8]
# random value: 3
# [0, 2, 1, 0, 2] [3] [3, 4, 6, 9, 3, 8, 4, 8, 9, 8, 3, 3, 7, 9]
# random value: 5
# [0, 1, 3, 1, 2, 1, 3, 4, 0] [5] [6, 6, 5, 8, 5, 7, 5, 8, 5, 5]
# random value: 6
# [0, 5, 2, 1, 1, 0, 3, 3, 0] [6] [7, 9, 6, 6, 6, 9, 6, 9, 8, 6]
我认为只要您付出一点努力,就可以编写快速排序的正确实现。
PS:校园图书馆有可能有一本宾利的书,我发现这是一本非常愉快的读物......