哨兵插入排序

Insertion sort with sentinel

我想知道在这段代码中添加哨兵是否有目的?

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;
            }
        }
    }
}

如果答案是肯定的,我应该怎么做?因为如果我复制所有选项卡,我很确定没有哨兵更好...... 谢谢 ;)

有办法在插入排序中生成自然哨兵。第一次遍历整个数组,找到最小的元素移到第一个位置

在那之后你摆脱了内循环中的索引检查。 Sedgewick 书中第二阶段的示例代码(C 中的算法):

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 元素比较 与 (n^2/2 元素比较 + n^2/2 i索引比较 在普通情况下)。

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