【问题标题】:Quicksort Partition Python快速排序分区 Python
【发布时间】:2018-09-13 13:02:44
【问题描述】:

我的快速排序有点问题。这是我的程序:

def main():
     Array = [10, 5, 3, 8, 6, 7, 4, 9, 2, 1, 10]
     right_index = (len(Array) - 1)
     left_index = 0
     Quicksort(Array, left_index, right_index)

def Quicksort(Array, left_index, right_index):
    if len(Array) == 1:
        return Array
    pivot_index = Partition(Array, left_index, right_index)
    Quicksort(Array, left_index, pivot_index-1)
    Quicksort(Array, pivot_index + 1, right_index)
    return Array

def Partition(Array, left_index, right_index):
    pivot = Array[left_index]
    i = left_index + 1
    for j in range(left_index + 1, right_index):
        if Array[j] <= pivot:
            Array[j], Array[i] = Array[i], Array[j]
            i += 1
    Array[left_index], Array[i - 1] = Array[i - 1], Array[left_index]
    return i - 1

main()

我做错了吗?我得到错误:for j in range(left_index + 1, right_index)

RecursionError: maximum recursion depth exceeded in comparison".

感谢任何人提供的任何帮助。

【问题讨论】:

  • 快速排序函数中的基本情况考虑
  • 我在调用 partition 之前添加了一条语句,以确保 left_index 始终小于 right 索引,因此它不会永远递归调用,对吗?虽然现在我得到了错误: Array[left_index], Array[i-1] = Array[i-1], Array[left_index] IndexError: list index out of range
  • 哥们,你错过了 len(Array) 永远不会减少你调用函数的方式。
  • 你能再详细一点吗?感谢您的帮助,很抱歉,递归算法相对较新。

标签: arrays python-3.x algorithm recursion quicksort


【解决方案1】:

当您遇到递归错误时,您的终止条件通常有问题。 (这就是 moghya 试图告诉你的,虽然不是很清楚。)在你的情况下:

if len(Array) == 1:
    return Array

您使用两个索引来跟踪您当前正在处理的子数组。基本数组Array 的长度始终为11;您对该数组所做的唯一更改是交换元素。因此,您的终止条件应该是:

if left_index >= right_index:
    return Array

您的代码中还有另一个错误:当您对数组进行分区时,您错过了最后一个元素。这里:

for j in range(left_index + 1, right_index):

上限应该是right_index + 1。由于您选择使用包含上限,即right_index 是最后一个有效索引,可能会引入此错误。

这不是 Python(和许多其他语言)处理数组的方式。 Python 数组和范围有一个包含的下限和一个独占的上限。从零开始的索引和排他上界一开始似乎有点不合时宜,但我建议您接受而不是反对这种约定。

我还建议您编写一个包装器快速排序函数,该函数不需要显式传入绑定的数组。将所有这些放在一起,您会得到:

def main():
     Array = [10, 5, 3, 8, 6, 7, 4, 9, 2, 1, 10]
     quicksort(Array)

     print Array

def quicksort(a):
    quicksort_sort(a, 0, len(a))
    return a

def quicksort_sort(a, left, right):
    if left + 1 < right:
        ipivot = quicksort_part(a, left, right)    
        quicksort_sort(a, left, ipivot)
        quicksort_sort(a, ipivot + 1, right)

def quicksort_part(a, left, right):
    pivot = a[left]
    i = left + 1

    for j in range(left + 1, right):
        if a[j] <= pivot:
            a[j], a[i] = a[i], a[j]
            i += 1

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

    return i

main()

【讨论】:

  • 非常有用的谢谢你,准备睡觉并在我的手机上阅读这篇文章,但我很确定这消除了我的困惑,干杯
  • 我建议编辑你的代码,因为当你尝试将数组减少 1 时出现类型错误,我相信你想要做的是`` i -= 1` ` 而不是 a -= 1
猜你喜欢
  • 1970-01-01
  • 2015-10-28
  • 2021-06-11
  • 2017-08-15
  • 1970-01-01
  • 2010-12-06
  • 2011-11-04
相关资源
最近更新 更多