【问题标题】:Inductive Proof of Counting Sort?计数排序的归纳证明?
【发布时间】:2019-03-15 19:12:22
【问题描述】:

我正在介绍计数排序算法,并且我了解它的工作原理,但我想知道是否有特定的方法可以证明计数排序是一种稳定的算法。我有一个关于如何归纳证明这一点的想法,但我不确定如何去做。

for i = 1 to k
    C[i] = 0

for j = 1 to n
   C[A[j]] = C[A[i]] + 1

for i = 2 to k
   C[i] = C[i] + C[i-1]

for j=n to 1
   B[C[A[j]]] = A[j]
   C[A[j]]--

我假设证明将从数组只有一个元素的基本情况开始

基本情况 n = 1,未排序数组 A[1] = a1 ,已排序数组 B[1] = a1

归纳步骤: ??? 我不确定如何处理这种归纳证明。

【问题讨论】:

  • 您在第二个循环中有错字,C[A[i]] 应该是 C[A[j]]。我会使用反证法。给定两个元素xy,其中y 跟在原始数组中的x 之后。假设在输出数组中x 跟在y 后面,证明这会导致矛盾。

标签: algorithm proof induction


【解决方案1】:

要通过数学归纳证明计数排序是稳定排序,你必须做三件事:

  1. 选择一个基本情况并证明您的声明在基本情况下是正确的。
  2. 假设对于大小不超过并包括某个大小 k 的所有问题实例,该声明都是正确的。这是一种强大的归纳,但我们不妨这样做,因为它少了一件需要担心的事情。
  3. 演示下一个更大尺寸的问题实例必须如何保持声明的真实性。

我们的基本情况也可能是空数组和大小为 1 的数组。任何排序算法在这些上都很稳定。

归纳假设同样容易表述:计数排序在所有不超过 k 个元素的数组上是稳定的。

归纳步骤是棘手的部分。考虑一个大小为 k+1 的数组。这个数组有一个最大的最后一个元素(在按排序标准最大的元素中,有一个出现在数组的最后一个)。考虑通过从大小为 k+1 的数组中删除该元素并将出现在其右侧的元素向左移动以填充间隙而获得的大小为 k 的数组。根据归纳假设,计数排序在这个大小为 k 的数组上是稳定的。为了证明计数排序在大小为 k+1 个元素的数组上是稳定的,因此我们必须证明计数排序不能将最大的最后一个元素放在任何相同大小的元素之前。要看到这是真的,请注意在构造输出数组 B 时,j 按降序假定值 n、n-1、...、1,因此在与我们最大的最后一个元素具有相同值的所有元素中,它将首先到达我们的元素。因此,可以保证将此元素放置在 B 中的右侧,而不是放置具有相同值的任何其他元素,因为 C[A[j]] 在构造 B 的循环中是递减的,而不是递增的。

【讨论】: