我想知道是否有向此代码添加标记的目的吗?
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;
}
}
}
}
如果答案为是,该怎么办?考兹,如果我复制所有标签,我很确定没有哨兵会更好。 谢谢;)
答案 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比较)。
我认为应该存在速度增益,但是速度增益不是很大(元素比较可能会更重,并且两种情况下的换挡操作次数也相同)。您可以分析这两种方法,并了解特定案例的结果。