使用python快速排序实现

时间:2018-02-24 20:10:50

标签: python-3.x quicksort

def partition(lst, low,high, pivot,col):

    lst[high],lst[pivot] = lst[pivot],lst[high]
    pivot = high
    i = low
    while i +1 <pivot:
        if lst[i][col] > lst[pivot][col]:
            lst[pivot], lst[pivot-1] = lst[pivot-1], lst[pivot]
            lst[i],lst[pivot] = lst[pivot],lst[i]
            pivot -= 1
        else:
            i +=1
    if lst[i][col] > lst[pivot][col]:
        lst[i],lst[pivot] = lst[pivot],lst[i]
        pivot -= 1
    return pivot

def quick(lst,low,high,col,ascending):
    if low >= high:
        return
    else:
        #print(low,high)
        pivot = random.randint(low,high)
        #print(pivot)
        part_point = partition(lst,low,high,pivot,col)
        print(part_point,high)
        quick(lst,low,part_point-1,col,ascending)
        quick(lst,part_point+1, high,col, ascending)

我正在使用Python学习算法,这是我对quicksort的实现。虽然它在某些情况下运行良好,但在大多数情况下它超过了递归深度。我认为我的执行中有一些错误,我错过了。

1 个答案:

答案 0 :(得分:0)

我不习惯在分区方法中看到枢轴更改。通常将数据透视表设置为数组中的左元素。它可以任选地用随机元素a [k]切换,其中低<= k <=高。通常,分区方法使用两个变量i和j,其中i是计数器,因为分区从左到右穿过数组,j表示最大元素a [j],使得a [j] <= pivot。 a [j]处的值在分区函数结束时与[low]交换,函数返回j。

Sedgewick和Wayne在他们的网站上有关于这个主题的奇妙章节:https://algs4.cs.princeton.edu/23quicksort/