以下是插入排序的算法。第一个使用移位机制将值放在左侧排序部分。第二个交换连续值,直到左侧部分排序。
通过转移
function insertionSort(array A)
for i from 1 to length[A]-1 do
value := A[i]
j := i-1
while j >= 0 and A[j] > value do
A[j+1] := A[j]
j := j-1
done
A[j+1] = value
done
通过交换
function insertionSort(array A)
for (i =0; i<N; i++)
for(int j=i; j>0; j--)
if(less(A[j], A[j-1]))
exch(A, j, j-1)
else
break;
done
done
维基百科说这是关于插入排序的运行时分析:
Worst case performance: O(n^2) comparisons, swaps
Best case performance: O(n) comparisons, O(1) swaps
Average case performance: O(n^2) comparisons, swaps
符合算法2.但在算法1的情况下,分析变为:
Worst case performance: O(n^2) comparisons, O(n) swaps
Best case performance: O(n) comparisons, O(1) (no) swaps
Average case performance: O(n^2) comparisons, O(n) swaps
请澄清转移和交换的含义。
答案 0 :(得分:2)
回答一般问题:转移是将所有元素移动一个位置。交换是在两个不同的索引处交换元素。
考虑以下数组:
a b c d e f
并假设我们想将元素e
放在第二个位置。
移位移位后,数组变为
a e b c d f
(序列b c d
向右移动了一段,为e
插入了空间。)
交换通过交换,数组变为
a e c d b f
(元素b
和e
交换位置。)
对于您发布的特定算法,第一个只是向右移动元素,直到找到新元素所在的位置然后插入它。第二个将元素放在最后,然后重复地将新元素与前一个元素交换,直到发现它处于正确的位置。
编辑:关于两种算法的性能分析差异:我认为基于移位的算法的分析是有缺陷的,因为它不计算移动O(n)元素的工作(最差和平均情况下的性能) )在外循环的每次迭代期间。虽然转换既不是比较也不是交换,但它代表着工作(交换的大约三分之一,但是在大O计算中常数乘数并不重要。)如果一个(错误地)忽略了转移的成本,则可以很容易地解释这些差异。在移位的情况下,外循环的每次迭代都需要内循环的O(n)次迭代,但只需要一次交换(一旦找到插入位置)。另一方面,基于交换的算法除了在外循环的每次迭代中执行的最后一次比较之外都进行交换。
P.S。我在Wikipedia page on insertion sort中没有看到两个单独的性能分析,也没有看到基于交换的实现。
答案 1 :(得分:1)
交换意味着交换场所。 示例:1 2 3 4 5 交换第二个loc和5个loc将给出输出:1 5 3 4 2。
移动意味着只需从当前位置移动。 示例:1 2 3 4 5 左转两个位置:3 4 5空空。
插入排序使用移位。它将要插入的元素存储在某个变量中,找到变量的正确位置并向右移动一个位置。在你的情况下,你通过交换不必要的相邻元素进行转移。这是一个开销。
答案 2 :(得分:0)
我所说的是维基百科给出的分析,即
最差案例表现:O(n ^ 2)比较,互换 最佳案例表现:O(n)比较,O(1)掉期 平均案例绩效:O(n ^ 2)比较,互换
是正确的,根据Algo 2.但是在主要文本中我发现Algo 1用于插入排序。但在这种情况下,分析将成为。
最差案例表现:O(n ^ 2)比较,O(n)掉期 最佳案例表现:O(n)比较,O(1)(无)掉期 平均案例绩效:O(n ^ 2)比较,O(n)交换
一般情况下要考虑什么。基于变换的算法或完全交换的算法。我在书中看到的(CLRS)和我的老师也告诉我基于插入排序Algo。但在这种情况下总数没有。掉期将成为O(n)。我读到某个地方,当我们关注不是时,我们更喜欢选择排序而不是Inseertion排序。写作选择排序需要O(n)次写入,插入排序需要O(n ^ 2)次写入[Swap]。
现在考虑一下这个问题,这将清除我的怀疑
Q值。与传统的插入排序算法相反。如果我们使用二进制搜索来找到新元素的位置,那么这个文本的时间复杂度将是
第一部分 a)在最坏的情况下将保持O(n ^ 2)。 b)在最坏的情况下会变为O(n logn)。
第二部分 a)总数没有。写入将保持为O(n ^ 2) b)总数。对于O(n ^ 2)
,写入将变得更少