【发布时间】:2019-02-26 04:10:57
【问题描述】:
一些排序算法,如插入排序,对于 n! n 个元素的可能排列,这意味着对于这些排列,对于某个常数 k,插入排序所做的比较次数为 kn。对于给定的常数 k,任何给定的比较排序可以在 kn 次比较中终止的最大排列数是多少?
【问题讨论】:
标签: algorithm sorting runtime complexity-theory
一些排序算法,如插入排序,对于 n! n 个元素的可能排列,这意味着对于这些排列,对于某个常数 k,插入排序所做的比较次数为 kn。对于给定的常数 k,任何给定的比较排序可以在 kn 次比较中终止的最大排列数是多少?
【问题讨论】:
标签: algorithm sorting runtime complexity-theory
插入排序中的操作次数取决于反转次数。所以我们需要评估n 值的排列数量(为简单起见,1..n),正好包含k 反转。
我们可以看到Inv(n, 0) = 1 - 排序数组
还有Inv(0, k) = 0 - 空数组
我们可以得到带有n元素和k反转的数组:
- 将值n 添加到数组的末尾,带有n-1 项和k 反转(因此反转的数量保持不变)
-在数组末尾插入值n,带有n-1 项和k-1 反转(因此添加一个反转)
- 在数组末尾的两个元素之前插入值 n,带有 n-1 项和 k-2 反转(因此添加两个反转)
-等等
使用这种方法,我们可以逐行和逐个单元格地填写表格Inv[n][k]
Inv[n][k] = Sum(Inv[n-1][i]) where j=0..k
【讨论】:
每次比较最多会使您可以区分的输入排列的从不翻倍。因此,通过kn 比较,您最多可以对2^(kn) 排列进行排序。
【讨论】: