Python 快速排序,第一个元素作为轴心,快速代码检查
尝试使用列表的第一个元素作为轴心进行快速排序 这件事已经过去好几个小时了,就是找不到我的错误Python 快速排序,第一个元素作为轴心,快速代码检查,python,quicksort,Python,Quicksort,尝试使用列表的第一个元素作为轴心进行快速排序 这件事已经过去好几个小时了,就是找不到我的错误 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[
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]
有人看到我哪里出错了吗?pivot元素似乎位于正确的位置,但不是idk:我认为您的代码无法处理这样的情况:
2 5 3 7 6
在这种情况下,轴心比所有其他元素都小,所以swap不能更改。在循环之前更改轴心,然后对其余的进行排序。此外,您不需要在循环中递增run。我像贝娄一样修改了你的代码,现在它工作了。还有一件事,如果你写rangel+1,r,你会错过最后一个元素。因为您是这样调用函数的:quickSorttestl,0,lentestl-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
为什么对一个你根本不用的变量有一个全局声明?!你做了什么调试;最短的失败例子是什么?你是说计数?我只是还没删掉。。应该计算比较的次数。。但如果排序根本不起作用,那就没有意义了。即使有3个数字,它也不起作用:请阅读-这是一个致命的赠品,你没有费心将你的代码删减到只需要重新创建问题的内容。我希望我的编辑使它更好。我建议你用打印语句和/或使用例如可视化它的操作来丰富你的代码。你目前的逻辑至少有两个缺陷。所以。。。你改变了什么,为什么?
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