只是编写一个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
答案 0 :(得分:0)
while (i <= j) and (a[i] < x):
i += 1
当i = j
和j
设置为len - 1
时,i+=1
会使其超出范围。
答案 1 :(得分:0)
在跳转和调试代码之前,您必须了解quicksort背后的想法。很容易理解导致“代码错误”的原因IndexOutOfBound
,但“逻辑错误”不是这样
快速排序算法的关键是分区。 在分区中,通常将一个数据透视作为比较点。 在您的情况下,您选择索引0作为您的支点。现在假设你在数组中有3个逻辑分区。
index: 0
)index: 1..i
)index: i..j
)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算法(因为在处理边缘情况时更容易理解)和快速排序算法中的两个递归调用。
希望对你有所帮助。