尝试快速排序,将列表的第一个元素作为支点。
已经过了好几个小时了,发现我的错误。
def quickSort(aList, l, r):
#global count
if l < r:
swap = l+1
for run in range (l+1,r):
if aList[l] > aList[run]:
aList[swap],aList[run]=aList[run],aList[swap]
swap += 1
run += 1
aList[l],aList[swap]= aList[swap],aList[l]
quickSort(aList, l, swap-1)
quickSort(aList, swap+1, r)
testl=[4,6,3,7,2]
print testl
quickSort(testl,0,len(testl)-1)
print testl
输出是:
[4,6,3,7,2]
[3,6,4,2,7] 谁知道我哪里出错了?枢轴元素似乎在正确的位置,但不是idk :(
答案 0 :(得分:0)
我认为您的代码无法处理这样的情况:
2 5 3 7 6
在这种情况下,枢轴小于所有其他元素,因此swap
不能更改(在循环之前更改它),我们对其余元素进行排序。此外,您不需要在循环中增加run
。我改变你的代码就像波纹管一样,现在它可以工作了。还有一件事,如果你写range(l+1,r)
,你会错过最后一个元素。因为你正在调用这样的函数:quickSort(testl,0,len(testl)-1)
def quickSort(aList, l, r):
#global count
if l < r:
swap = l
for run in range (l+1,r+1):
if aList[l] > aList[run]:
swap += 1
aList[swap],aList[run]=aList[run],aList[swap]
#run += 1
aList[l],aList[swap]= aList[swap],aList[l]
quickSort(aList, l, swap-1)
quickSort(aList, swap+1, r)
答案 1 :(得分:-1)
修改您的代码如下
def quickSort(aList, l, r):
if l < r:
swap = l+1
pivot = aList[l]
for run in range (l+1,r):
if pivot > aList[run]:
aList[swap],aList[run] = aList[run],aList[swap]
swap+=1
aList[l],aList[swap-1] = aList[swap-1],aList[l]
quickSort(aList, l, swap-1)
quickSort(aList, swap, r)
return aList
test = [4,6,3,7,2]
t = quickSort(test,0,len(test))
print t