algorithm - QuickSort分区的循环不变量

标签 algorithm sorting quicksort loop-invariant

我在为某些快速排序算法的实现定义和证明循环不变量 时遇到问题。这既不是 Lomuto 的也不是 Hoare 的分区版本。

如果您知道以这种方式实现的某些已知版本的快速排序,请告诉我。

算法在 Python 中的实现:

def partition(arr: list, p: int, r: int):
    y = arr[p]
    i = p
    j = r + 1

    while i < j:
        i = i + 1

        while i <= r and A[i] < y:
            i = i + 1

        j = j - 1

        while j >= p and A[j] > y:
            j = j - 1

        if i <= j:
            swap(arr, i, j)

    swap(arr, j, p)

    return j


def quicksort(arr: list, p: int, r: int):
    if p < r:
        q = partition(arr, p, r)
        quicksort(arr, p, q - 1)
        quicksort(arr, q + 1, r)


def swap(arr: list, i, j):
    tmp = arr[i]
    arr[i] = arr[j]
    arr[j] = tmp

我已经设法定义了以下循环不变量(它可能不正确):

At the beginning of each iteration of the while loop, for each index k in array A:

  • if k = p, so A[k] = y

  • if p < k <= i, so A[k] < y

  • if j <= k <= r, so A[k] > y

请帮我为 while 定义一个循环不变式循环 partition()方法(如果上述不正确),并证明。

最佳答案

外层 while 的不变量表示到目前为止已扫描的数组部分,即范围 A[p..i]A[j..r],左边元素不大于pivot,右边元素不小于pivot。 (当然,A 的内容是初始内容的排列。)

当循环退出时,所有左侧元素都不大于所有右侧元素,因此 A[p..r] 被分区。

关于algorithm - QuickSort分区的循环不变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55429988/

相关文章:

C# 相当于 std::sort 和 std::unique

java - 自定义 SortComparator 在 MapReduce wordcount 程序中不起作用

java - 为什么我的合并排序比快速排序慢?

java - 快速排序 Java 。 ArrayIndexoutofBoundsException异常

java - 如何根据 Java 列表中的重复获取前 N 个值

python - 通过循环创建二叉树

javascript - 使用javascript按元素与给定目标的距离对整数数组进行排序

c++ - 如何使快速排序递归?

algorithm - 给定所有根,如何在时间上比 O(n^2) 更快地找到多项式的系数?

java - 连续检测对角线获胜 - tic-tac-toe, gomoku