我希望获得{1,...,n}的排列数,其中Insertion Sort完全执行n(n-1)/ 2次比较。 例如,对于{1,2,3,4}我们得到(4,3,2,1),(3,4,2,1),(4,2,3,1)等等。他们InsertionSort进行4 * 3/2 = 6次比较。 有人知道一些确切的公式吗? 我正在考虑像(n-1)+ 1 = n这样的东西 1表示反向序列,然后我们可以以相反的顺序交换所有(n-1)对。
答案 0 :(得分:0)
这是一个提示。 (1, 2, 3, 4)
的完整列表包括:
(4, 3, 2, 1)
(3, 4, 2, 1)
(4, 2, 3, 1)
(2, 4, 3, 1)
(4, 3, 1, 2)
(3, 4, 1, 2)
(4, 1, 3, 2)
(1, 4, 3, 2)
从最后一栏到第一栏来看。
逐步浏览插入排序。看看他们合并的地方。你看到那里的模式吗?
反转它,你能弄清楚我是如何生成这个列表的吗?你能证明这份清单是完整的吗?
为什么这里重要的是什么。只是说2n-1
没用。
答案 1 :(得分:0)
n(n-1)/2
是(1, n - 1)
范围内所有元素的总和。由于您的序列长度为n
,因此您可以将该范围扩展为(0, n - 1)
。
每次插入的互换次数为:
run # list value swaps
1 [] a 0 (no swaps possible)
2 [a] b 1
3 [b, a] c 2
...
10 [i,...,a] j 9
...
n [...] ? n - 1
因此,我们需要将每个元素移动到整个列表中,以实现所需的交换计数。比较次数最多可以比交换次数高一次,这意味着要插入的每个值必须放在结果列表的第一个或第二个索引处。或者
换句话说,假设输出的升序排序:
输入列表通常应该是一个几乎下降的列表,其中列表中的每个元素前面最多可以有一个不大于相关元素的元素。