快速排序的最后一步不正确

时间:2018-11-03 18:59:06

标签: python-3.x sorting quicksort

我正在用Python 3.6编写用于列表的快速排序的代码。

在每一步中,我都打印出i和j的值(我使用过的两个变量)以及列表(以及正在交换的值)。该代码可以正常工作,直到最后一步,即40和50交换。放置60之后,它不会再移动到最后一步(交换40、50)。我不确定为什么会这样。在那之前,一切都很好。

**我已经尝试过自己编写程序,因此暂时请忽略算法的效率(尽管欢迎任何建议)

 

我的最终结果:str_replace(' ','TEST',$data) 50,40 str_replace(' ','TEST',$data);(将60放在正确的位置之后,程序结束了)

我已经尝试对QuickSort函数进行以下更改(在参考其他答案之后),但是结果更加混乱了……

L=[35, 10, 40, 20, 60, 30, 90, 70, 50]

l=0
h=9

def partition (L, l, h):
    print("\n########## Partition() invoked: ",l,h)
    pivot = L[l]
    i = l
    j = h
    #print(i,j)
    while i<j:
        print(pivot, "***********", L)
        while True:
            i=i+1
            print("i=",i, L[i])
            if L[i]>pivot or i>=len(L):

                break
        while True:
            j=j-1
            print("j=",j, L[j])
            if L[j]<=pivot or j<0:
                break
        print("Check greater", i, j)
        if i>j:
            break
        print("Swapping: ",L[i],L[j])
        L[i], L[j] = L[j], L[i]

    print("l=", L[l], "  j=", L[j], L)
    j_val=L[j]
    l_val=L[l]
    L[l]=j_val
    L[j]=l_val
    print("l=", L[l], " j=", L[j] , l, j,  L)
    return i


def QuickSort( L, l, h):
    print(l, h)
    j = partition(L, l, h)
    partition(L, l, j+1)
    partition(L, j, h)

QuickSort(L,l,h)
print(L)

1 个答案:

答案 0 :(得分:0)

您对QuickSort的实现不正确。它不是递归的,它只调用partition 3次,不能完全对包含多个元素的列表进行排序。后两个调用应该是对QuickSort的递归调用。

当然,当您使代码递归时,还需要添加一个基本案例,以便递归结束。幸运的是,通过查看lh,很容易看出何时不需要进一步排序。列表中少于两个元素的部分不需要再进行排序。

这就是我要做的:

def QuickSort(L, l, h):
    if h - l < 2:            # add a base case
        return
    j = partition(L, l, h)
    QuickSort(L, l, j)       # recurse
    QuickSort(L, j+1, h)     # here too

作为旁注,通常不建议使用l(小写L)作为变量名,因为在某些字体中,很难分辨出它与1之间的区别(一个数字)。我还要避免使用仅在大小写不同的变量(例如lL一样)。更好的名字更具描述性。尽管ij有时对于索引来说还可以,但我还是更希望使用字母更多的名称来处理几乎所有稍微复杂的事情。在这种情况下,lowhigh可能是参数的更好名称。