快速排序,第一次排序工作,递归调用的参数不是

时间:2015-10-29 23:09:25

标签: python quicksort

我想写自己的快速排序(我是一个开始的程序员,我知道我可以在网上查看,关键是我可以通过松散的描述变得更好)

它在第一次迭代时排序,但遗憾的是我无法为递归调用获取正确的参数。我想我需要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

2 个答案:

答案 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)应该具有包容性;虽然如果你想写一个独家(左,右)你可以,但它只会违背普遍接受的[左,右]或[左,右]。

试一试: https://repl.it/BVTx/1

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