【问题标题】:QuickSort Python In-place index out of bounds errorQuickSort Python就地索引超出范围错误
【发布时间】:2015-02-10 04:46:26
【问题描述】:
只是编写一个快速排序算法,我似乎无法摆脱索引越界错误或无限循环。有人可以指出我正确的方向吗?提前致谢!
----------- 快速排序 --------------
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
【问题讨论】:
标签:
python
indexoutofboundsexception
quicksort
【解决方案1】:
while (i <= j) and (a[i] < x):
i += 1
当i = j 和j 设置为len - 1 时,i+=1 将导致它超出范围。
【解决方案2】:
在跳转和调试代码之前,您必须了解快速排序背后的理念。很容易理解导致“代码错误”的原因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。
这种快速排序之所以可以只分区为两部分排序,是因为每次分区时,pivot其实都在数组的排序索引中。
Web 中有许多快速排序的实现。不要因为看它们而感到困惑。基本上思路是一样的。 (2 分区与枢轴排序)。有些实际上实现了从左到右的分区,而另一些则是从右到左。在您的情况下,您似乎将两个方向混合在一起。这样i 向右,j 向左。所以在这样做的时候,你只需要小心这个边界,尤其是在交换期间。
过去,我在分区方法中使用一个迭代循环(因为在处理边缘情况时更容易理解)和快速排序算法中的两个递归调用来编写快速排序算法。
希望对你有所帮助。