对于按升序实现的稳定插入排序,移动元素的条件通常应为 a[j] >= key ,这样能够保证相等元素的相对 顺序不变。
while (j >= 0 && a[j] >= key) {
a[j + 1] = a[j];
j--;
}这类题看到"稳定排序"四个字就要警觉——稳定性是排序算法的隐性考点。插入排序的核心是"把当前元素插入到已排序部分正确位置",稳定性的关键在于:遇到相等元素时,必须把后面的那个放在前面那个之后。所以判断条件要包含等号,用 >= 而不是 >。
选项 A 看似反直觉——通常我们找插入位置是找第一个比 key 大的元素,用 > 判断。但这里不是找位置,是移动元素腾出空间。用 > 的话,遇到相等元素不会移动,key 就插到了相等元素前面,稳定性被破坏。命题人就是把"找位置"和"移动元素"两个动作混在一起,利用考生对插入排序流程的模糊记忆设坑。
这类题看到"稳定排序"四个字就要警觉——稳定性是排序算法的隐性考点。插入排序的核心是"把当前元素插入到已排序部分正确位置",稳定性的关键在于:遇到相等元素时,必须把后面的那个放在前面那个之后。所以判断条件要包含等号,用 >= 而不是 >。
选项 A 看似反直觉——通常我们找插入位置是找第一个比 key 大的元素,用 > 判断。但这里不是找位置,是移动元素腾出空间。用 > 的话,遇到相等元素不会移动,key 就插到了相等元素前面,稳定性被破坏。命题人就是把"找位置"和"移动元素"两个动作混在一起,利用考生对插入排序流程的模糊记忆设坑。
本题考查 GESP 四级《算法与数据结构》模块中稳定排序与插入排序实现的交叉点。命题人放这道题,就是要卡住那些只背"插入排序代码"但不懂"为什么这么写"的考生——他们知道要移动元素,但分不清 > 和 >= 在稳定性上的本质区别。