归纳计数计数证明?

时间:2018-10-10 19:36:22

标签: algorithm proof induction

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  1. 选择一个基本案例,并证明您的主张在该基本案例中是正确的。
  2. 假定对于大小不超过k(包括k)的所有问题实例,该声明均成立。这是很强的归纳方法,但我们也可以这样做,因为这是一件值得担心的事情。
  3. 演示下一个更大大小的问题实例必须如何维护声明的真实性。

我们的基本情况可能是空数组和大小为1的数组。任何排序算法都对此非常稳定。

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

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