具有自定义停止条件的python快速排序

时间:2016-10-24 20:30:07

标签: python arrays algorithm quicksort

基于this答案,我想使用自定义停止条件的快速排序,以便从Python中的未排序数组生成k排序数组。我认为是len(array) = m*k所以会有m个子数组(不一定排序),子数组i的元素低于或等于子数组j的元素i<j

def partition(array, left, right):
    pivot = array[right]
    i = left - 1

    for j in range(left, right):
        if array[j] <= pivot:
            i += 1
            temp = array[i]
            array[i] = array[j]
            array[j] = temp
    temp = array[right]
    array[right] = array[i + 1]
    array[i + 1] = temp
    return i + 1

def k_quicksort(array, left, right, k):
    if right - left > k:
        p = partition(array, left, right)
        k_quicksort(array, p + 1, right, k)
        k_quicksort(array, left, p - 1, k)

我在链接中引用的答案表明我应该更改停止条件并检查开始(left)和结束(right)索引是否大于k分开如果没有那么就不要再发了。我用

测试这个算法
x = [scipy.random.randint(1,100) for i in range(16)]
k_quicksort(x,0,len(x)-1,4)

我得到了

x = [19, 13, 1, 28, 42, 49, 73, 59, 62, 56, 74, 89, 78, 90, 91, 98]

哪个是错误的。我不清楚习惯性停止条件还是其他一些错误的bug?任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

要限制为difftime数组,您需要跳过数组末尾的递归:

k-sorted

您需要分区以确保您正在排序的内容是正确的值。但是你可以跳过def swap(arr, i, j): arr[i], arr[j] = arr[j], arr[i] def partition(array, left, right): pivot = array[right - 1] i = left for j in range(left, right - 1): if array[j] <= pivot: swap(array, i, j) i += 1 swap(array, right - 1, i) return i def k_quicksort(array, left, right, k): if left == right: return p = partition(array, left, right) k_quicksort(array, left, p, k) if k > p + 1: k_quicksort(array, p + 1, right, k) 右边所有值的递归(以及排序)。

编辑:修复你的快速排序。