我想写自己的快速排序(我是一个开始的程序员,我知道我可以在网上查看,关键是我可以通过松散的描述变得更好)
它在第一次迭代时排序,但遗憾的是我无法为递归调用获取正确的参数。我想我需要2个递归调用,一个用于左侧,一个用于我的pivot元素新位置的右侧。
我知道通过更好的枢轴选择可以更快地完成快速排序,我只选择了列表的第一个元素。
def qt(alist,l,r):
if l != r:
x=l+1
run=l+1
while run<r:
if alist[l]>alist[run]:
alist[x],alist[run]=alist[run],alist[x]
x=x+1
run=run+1
else :
run=run+1
alist[x],alist[l]=alist[l],alist[x]
#qt(alist,0,x-1)
#qt(alist,x+1,r)
clist = [54,26,93,17,77,31,44,55,20,104,3,5,123,423423,9]
l=0
r=len(clist)
qt(clist,l,r)
print clist
答案 0 :(得分:2)
为了清楚起见,我会重命名一些事情(我建议你这样做):
def quickSort(aList, l, r):
if l < r:
swap = l
run = l
pivot = aList[r]
while run < r:
if pivot >= aList[run]:
aList[swap],aList[run]=aList[run],aList[swap]
swap += 1
run += 1
aList[swap], aList[r] = aList[r], aList[swap]
quickSort(aList, l, swap-1)
quickSort(aList, swap+1, r)
您的swap
值(a.k.a x
)应该具有包容性;虽然如果你想写一个独家(左,右)你可以,但它只会违背普遍接受的[左,右]或[左,右]。
答案 1 :(得分:1)
您的下标确实已经关闭。您必须使它们与基于0的Python索引保持一致。修复此问题将修复您的无限递归如果将其与小于&#39;检查一下。
此外,您的逻辑中存在轻微错误;你的x值超出界限。这是我的代码更新,以解决这些第一个问题;在标准调试打印语句的帮助下,我将把内部逻辑留给你。就在失败点之前,我们得到l = 13,x = r = 15的下标。
def qt(alist, l, r):
print "ENTER", alist, l, r
if l < r:
x = l+1
for run in range(l+1, r):
if alist[l] > alist[run]:
alist[x], alist[run] = alist[run], alist[x]
x += 1
print "subscripts", l, x, r
alist[x], alist[l] = alist[l], alist[x]
qt(alist, l, x-1)
qt(alist, x+1, r)
print "LEAVE", alist, l, r
clist = [54,26,93,17,77,31,44,55,20,104,3,5,123,423423,9]
l=0
r=len(clist)
qt(clist,l,r)
print clist