尝试使用三个中位数来实现快速排序,我不确定我哪里出错了?

时间:2017-06-17 01:35:54

标签: python quicksort

尝试使用三位数中值作为复习实现快速排序,我使用以下算法:here

唯一的区别是我试图使用三个值(低,中和高)的中间而不是最左边的值作为枢轴 - 从我的理解,这应该只改变几行代码,但由于某种原因,我的算法似乎没有正确排序,我不完全确定为什么?我已经尝试过它并且它不起作用 - 但我不知道哪里以及为什么它是错的。我注意到我的第一个问题是,不知何故,我的数组中的“0”在第一个分区传递中的完全错误的位置结束,我无法弄清楚为什么 - 不确定这是否有助于任何人查明问题,但我我的智慧结束了整天盯着这一切而没有到达任何地方。

def quicksort(arr, low, hi):
    def middle_of_three(arr, low, hi):
        mid = (low + hi) // 2
        if arr[low] > arr[mid]:
            arr[low], arr[mid] = arr[mid], arr[low]
        if arr[mid] > arr[hi]:
            arr[mid], arr[hi] = arr[hi], arr[mid]
        if arr[low] > arr[mid]:
            arr[low], arr[mid] = arr[mid], arr[low]
        return mid

    def partition(arr, low, hi):
        pivot = middle_of_three(arr, low, hi)  # get pivot index w/ median of three method
        left_wall = low
        for i in range(low + 1, hi):
            if arr[i] < arr[pivot]:
                arr[i], arr[left_wall] = arr[left_wall], arr[i]
                left_wall += 1
        arr[pivot], arr[left_wall] = arr[left_wall], arr[pivot]  # once you get to the end, swap pivot

        return left_wall

    if low < hi:
        pivot_loc = partition(arr, low, hi)
        quicksort(arr, low, pivot_loc)
        quicksort(arr, pivot_loc + 1, hi)
    print(sequence)


sequence = [2, 6, 5, 3, 8, 7, 1, 0]
size = len(sequence) - 1
quicksort(sequence, 0, size)

1 个答案:

答案 0 :(得分:0)

更改middle_of_three以返回数据透视值而不是数据透视索引,并对其余代码进行类似的更改。在分区过程中,pivot元素通常会被移动,因此使用pivot值可以使代码更简单。

我不熟悉正在使用的分区算法。通常对一对元素进行分区扫描,其中元素>枢轴发生在元素之前&lt;转动并交换它们,重复该过程直到达到某个扫描限制。如果使用中间元素值作为透视值,通常使用Hoare类型分区方案的变体。 Hoare方案扫描元素&gt;从左边开始,对于元素&lt;从右侧转动,并在左侧和右侧扫描的索引在阵列中间某处相遇时停止。枢轴指数将基于指数相遇的位置。

https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme

如果您仍然卡住了,我可以稍后在我的答案中添加一个C / C ++示例。