【问题标题】:implementing quicksort and getting a bug I don't understand实现快速排序并得到一个我不明白的错误
【发布时间】:2015-07-15 02:53:53
【问题描述】:

我有 2 个函数,一个对数组进行分区和快速排序的函数:

def partition(a, i, j):
    h = i+1

    for k in range(i+1, j):
        if a[k] < a[i]:
            a[h],a[k] = a[k],a[h]
            h += 1
    a[i],a[h-1] = a[h-1],a[i]

    return h 

# a is an array. After function call a[i..j-1] is sorted in increasing order
def quicksort(a, i, j):
    if j-i <= 1: return

    swap(a, i, j)
    p = partition(a, i, j)

    quicksort(a, i, p)
    quicksort(a, p, j)

这适用于我尝试过的所有测试用例,即我调用 quicksort(a, 0, len(a)) 并在列表 a 之后排序。

我正在尝试更改枢轴元素。我想使用数组的最后一个元素而不是第一个元素作为枢轴(就像上面的实现一样)。为此,我将以下代码行添加到分区之前的快速排序函数中:

a[i],a[j-1] = a[j-1],a[i]

然后一切都崩溃了。超出最大递归深度。我不明白为什么会这样,这让我发疯。

【问题讨论】:

  • [1,2,3] 将与p == 0 陷入无限循环;切换pp-1/p+1

标签: python algorithm search quicksort


【解决方案1】:

给定输入[1,2,3],它将陷入与p一致的无限循环;将pp-1/p+1 切换:

def quicksort(a, i, j):
    if j <= i: return

    swap(a, i, j)
    p = partition(a, i, j)

    quicksort(a, i, p-1)
    quicksort(a, p+1, j)

【讨论】:

  • [1,2,3] 适用于没有交换的代码。交换怎么会搞砸呢?
  • 在你的论文中写下循环过程:) @ÞórÓðinsson
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 2016-12-08
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多