这个quicksort的实现有什么问题?

时间:2017-08-12 23:04:39

标签: python algorithm quicksort

我正在尝试实施快速排序算法,选择枢轴作为最右边的元素,如Cormey等人所述,算法简介

enter image description here

这是我的Python实现:

def partition(A, p, r):
    pivot = A[r]
    i = p - 1
    for j in range(p, r-1):
        if A[j] < pivot:
            i += 1
            A[i], A[j] = A[j], A[i]
    A[i+1], A[r] = A[r], A[i+1]
    return i+1

def quicksort(A, p, r):
    if p < r:
        q = partition(A, p, r)
        quicksort(A, p, q-1)
        quicksort(A, q+1, r)

但是,如果我尝试这样测试它:

A = [2, 8, 7, 1, 3, 5, 6, 4]
quicksort(A, 0, len(A)-1)
print(A)

我得到一个未排序但只分区一次的数组:

[2, 3, 1, 4, 5, 7, 8, 6]

(也就是说,4左(右)的所有元素都比它小(大)。似乎quicksort的递归调用没有像调用A那样在输入数组partition上运行。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

错误在partition,完全在for j in range(p, r-1):中: 必须是for j in range(p, r):。发生这种情况是因为在Python中,停止索引不包含在范围内,但算法意味着包含r-1,因此必须停止在r,以便包含r-1