Quicksort分区无限循环

时间:2016-02-02 18:20:17

标签: python-3.x quicksort

arr = [7, 3, 5, 6, 7, 1, 8, 0, 4, 9, 6, 2]
def partitioning(arr, l, d):
    pivot = 5
    while l <= d:
        while arr[l] < pivot:
            l += 1
        while arr[d] > pivot:
            d -= 1
        arr[l], arr[d] = arr[d], arr[l]
partitioning(arr, 0, len(arr) - 1)
print(arr)

我不明白为什么当l&lt; = d时,当l和d变得相同时,它们会停止移动并保持交换到无穷大?

1 个答案:

答案 0 :(得分:1)

l == darr[l] == arr[d] == pivot时发生无限循环。在这种情况下,内部循环永远不会做任何事情,交换也不会做任何事情,因为两个索引是相同的(所以你自己交换枢轴)。

您希望在这种情况下退出顶部循环,因为数组已完全分区。您应该将外部循环上的<=更改为<,它应该可以正常工作。

您需要更改轴向选择逻辑(因为如果枢轴不在列表中,您的内部循环可能会在结束时运行ld列表),但我认为选择常量5只是一个初步的事情。