QuickSort Python就地索引越界错误

时间:2015-02-10 04:46:27

标签: python indexoutofboundsexception quicksort

只是编写一个quickSort算法,我似乎无法摆脱索引超出界限错误或无限循环。有人能指出我正确的方向吗?提前谢谢!

-----------快速排序--------------

def quickSort(lst):

    if len(lst) <= 1:
        return lst

    while len(lst) > 1:
        pivot = part(lst)
        quickSort(lst[ :pivot])
        quickSort(lst[pivot+1: ])
        return lst

def part(a):
    x = a[0]
    i = 1
    j = len(a)-1

    while (i <= j):
        while (i <= j) and (a[j] >= x):
            j -= 1
        while (i <= j) and (a[i] < x):
            i += 1
        if (i <= j) and a[i] > a[j]:
            temp = a[i]
            a[i] = a[j]
            a[j] = temp

    a[i], a[0] = a[0], a[i]     
    return i

2 个答案:

答案 0 :(得分:0)

while (i <= j) and (a[i] < x):
            i += 1

i = jj设置为len - 1时,i+=1会使其超出范围。

答案 1 :(得分:0)

在跳转和调试代码之前,您必须了解quicksort背后的想法。很容易理解导致“代码错误”的原因IndexOutOfBound,但“逻辑错误”不是这样

快速排序

快速排序算法的关键是分区。 在分区中,通常将一个数据透视作为比较点。 在您的情况下,您选择索引0作为您的支点。现在假设你在数组中有3个逻辑分区。

  • 数据透视:任意数字(index: 0
  • 分区1:任何小于数据透视表的数字。 (index: 1..i
  • 分区2:任何大于数据透视表的数字。 (index: i..j
  • 分区3:未分类的数字(index: j..n-1

您现在的目标是将分区3中的每个数字分配到分区1或2.然后因为分区3将被清空,我们离开2分区。使用分区1的最后一个元素交换轴。然后,您有以下Partition 1 < Pivot < Partition 2

接下来我们在Quicksort方法中处理Divide and Conquer技术。 在此方法中,您不必迭代分区。相反,您只需要再次为两个新分区中的每个分区再次调用Quicksort,这两个分区已被中间的枢轴分割。

这个快速排序只能分为两部分的原因是因为每次分区时,数据透视实际上都在数组的排序索引中。

网上有许多Quicksort的实现。不要因为看起来而感到困惑。基本上这个想法是一样的。 (2分区与枢轴排序)。一些实际上从左到右实现分区,而其他从右到左实现。在你的情况下,你似乎把两个方向混合在一起。这样i向右移动,j向左移动。因此,在这样做时,您只需要小心这个边界,特别是在交换期间。

过去,我在分区方法中使用一个迭代循环编写Quicksort算法(因为在处理边缘情况时更容易理解)和快速排序算法中的两个递归调用。

希望对你有所帮助。