Algorithm 插入排序中比较的确切数量
我想得到{1,…,n}的置换数,对于这些置换,插入排序正好进行n(n-1)/2次比较。 例如,对于{1,2,3,4}我们得到了(4,3,2,1),(3,4,2,2,1),(4,2,3,1)等等-对于所有这些,InsertionSort做4*3/2=6次比较。 有人知道确切的公式吗? 我在考虑(n-1)+1=n,其中Algorithm 插入排序中比较的确切数量,algorithm,sorting,insertion-sort,Algorithm,Sorting,Insertion Sort,我想得到{1,…,n}的置换数,对于这些置换,插入排序正好进行n(n-1)/2次比较。 例如,对于{1,2,3,4}我们得到了(4,3,2,1),(3,4,2,2,1),(4,2,3,1)等等-对于所有这些,InsertionSort做4*3/2=6次比较。 有人知道确切的公式吗? 我在考虑(n-1)+1=n,其中 1代表反向顺序,然后我们可以以反向顺序交换所有(n-1)对。这里有一个提示。(1,2,3,4)的完整列表如下: (4, 3, 2, 1) (3, 4, 2, 1) (4, 2, 3,
1代表反向顺序,然后我们可以以反向顺序交换所有(n-1)对。这里有一个提示。
(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,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
是无用的。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
因此,我们需要在整个列表中移动每个元素,以实现所需的互换计数。比较的数量最多可以比交换的数量高一个,这意味着插入的每个值必须放在结果列表的第一个或第二个索引中。或
换句话说,假设输出的升序:输入列表通常应该是一个近似递减的列表,其中列表中的每个元素前面最多可以有一个不大于所讨论元素的元素。
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
因此,我们需要在整个列表中移动每个元素,以实现所需的互换计数。比较的数量最多可以比交换的数量高一个,这意味着插入的每个值必须放在结果列表的第一个或第二个索引中。或
换句话说,假设输出的升序:输入列表通常应该是一个近似降序的列表,其中列表中的每个元素前面最多可以有一个不大于所讨论的元素的元素。非常感谢,但是您能给出更大的提示吗?我看到在最后一列中,你们只能放1或2,在前面的1或2或3,在第一列和第二列中,可以有所有的值,但为什么是这样?非常感谢,但你们能给出更大的提示吗?我看到在最后一列中,你们只能放1或2,在前面的1或2或3中,在第一列和第二列中,可以放所有的值,但为什么会这样呢?