【问题标题】:What's wrong with this implementation of quicksort?这个快速排序的实现有什么问题?
【发布时间】:2017-08-12 23:04:38
【问题描述】:

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

这是我的 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 的递归调用没有像对partition 的调用一样在输入数组A 上正确运行。我该如何解决这个问题?

【问题讨论】:

    标签: python algorithm quicksort


    【解决方案1】:

    错误在partition 中,正好在for j in range(p, r-1): 中: 一定是,for j in range(p, r):

    发生这种情况是因为在 Python 中,停止索引不包含在范围内,但算法意味着包含 r-1,因此必须在 r 处停止才能排序包括r-1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 2011-11-03
      • 1970-01-01
      • 2016-10-02
      相关资源
      最近更新 更多