带前哨的插入排序

时间:2018-10-16 21:06:18

标签: algorithm sorting insertion-sort

我想知道是否有向此代码添加标记的目的吗?

public void Sort(ArrayToSort<T> array) {
    for (var i = 0; i < array.Length; i++) {
        for (var j = i; j > 0; j--) {
            if (array.isLess(j, j - 1)) {
                array.Swap(j, j - 1);
            } else {
                break;
            }
        }
    }
}

如果答案为是,该怎么办?考兹,如果我复制所有标签,我很确定没有哨兵会更好。 谢谢;)

1 个答案:

答案 0 :(得分:0)

有一种方法可以使插入式自然哨兵。在整个数组中进行第一个遍历,找到最小的元素并将其移到第一位置。

之后,您将摆脱内循环中的索引检查。 Sedgewick书中第二阶段的示例代码(C语言中的Alg。):

for (i = l+2; i <= r; i++)
  { int j = i; Item v = a[i];
    while (less(v, a[j-1]))
      { a[j] = a[j-1]; j--; }
    a[j] = v;
  }

还请注意,插入排序使用元素移位而不是交换-以提高有效性。

在最坏的情况下使用此方法,您会遇到n^2/2 元素比较 s与({n^2/2 元素比较 + n^2/2 i ndex比较)。

我认为应该存在速度增益,但是速度增益不是很大(元素比较可能会更重,并且两种情况下的换挡操作次数也相同)。您可以分析这两种方法,并了解特定案例的结果。