Quicksort,第一个元素作为枢轴,快速代码检查

时间:2015-10-30 12:02:56

标签: 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[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 :(

2 个答案:

答案 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