这两个函数可以一起工作以对整数数组进行排序。函数quickSort
已完成,如果完全定义了partition
函数,它将正常工作。我不确定功能的其余部分应该是什么才能具有有效的功能。
def quickSort(mylist,start,end):
if start<end:
pivotpos = partition(mylist,start,end)
print("pos",pivotpos)
quickSort(mylist,start,pivotpos-1)
print(quickSort(mylist,start,pivotpos-1))
quickSort(mylist,pivotpos+1,end)
print(quickSort(mylist,pivotpos+1,end))
def partition(mylist,left,right):
pivot = mylist[left]
pivotpos = left
currentlow,currenthigh=left+1,right
while currentlow<=currenthigh:
if mylist[currentlow]<pivot:
elif mylist[currentlow]==pivot:
else:
return pivotpos
partition
函数必须重新排列列表并返回新的轴位置。
答案 0 :(得分:2)
在分区函数中,您必须将mylist
的每个小于pivot
的元素放在左边,将每个元素放在right
以下。我们使用currentlow
进行迭代,如果mylist[currentlow]
小于pivot
,我们必须交换它们。在currenthigh
变量中,我们保存最后一个元素的位置,如果我们遇到一个大于数据透视的值,它将被交换。这样我们总是在列表末尾放置大于pivot
的元素。我希望您能理解以下代码。
def quickSort(mylist, start, end):
if start < end:
pivotpos = partition(mylist, start, end)
#print("pos", pivotpos)
quickSort(mylist, start, pivotpos - 1)
#print(quickSort(mylist, start, pivotpos - 1))
quickSort(mylist, pivotpos + 1, end)
#print(quickSort(mylist, pivotpos + 1, end))
def partition(mylist, left, right):
pivot = mylist[left]
pivotpos = left
currentlow, currenthigh = left + 1, right
while currentlow <= currenthigh:
if mylist[currentlow] < pivot:
mylist[currentlow], mylist[pivotpos] = mylist[pivotpos], mylist[currentlow]
pivotpos = currentlow
elif mylist[currentlow] > pivot:
mylist[currentlow], mylist[currenthigh] = mylist[currenthigh], mylist[currentlow]
currenthigh = currenthigh - 1
currentlow = currentlow + 1
return pivotpos
输出:
>>> from a import quickSort
>>> a = [3223,1,321,2,43,54,65,1]
>>> quickSort(a,0,7)
>>> a
[1, 1, 2, 43, 54, 65, 321, 3223]