下面代码试图把数组按升序进行“插入排序”,横线处应填写( )。
void ins(int a[], int n){
for(int i = 1; i < n; i++){
int key = a[i];
int j = i-1;
while(j >= 0 && __________){
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}答案B。代码补全要考虑参数传递方式。如果需要修改实参,需用指针(*)传递。排序算法要理解每步比较的含义。
排序代码补全要理解每步比较的含义。选择排序找最小值时比较的是array[min]>array[j]。
【考点】插入排序|数组比较逻辑|while循环条件
1. 考纲定位 GESP 四级《算法基础》模块第 3 章排序算法。命题人专盯「手写排序算法时条件判断」这一薄弱点——90% 的题能选对,但一旦条件写反,整个排序逻辑就彻底崩掉,所以必须卡住这里。
2. 解题思维 插入排序的核心是:把 a[i] 当作 key,在已排序的前 i 个元素中从右向左「挤」空位。挤的条件很明确——只要当前元素 a[j] 比 key 大,就得往后挪(a[j+1]=a[j])。于是 while 里的条件必须表达「a[j] 大于 key 且还没越界」,即 j >= 0 && a[j] > key。这一步是插入排序的通用模板,任何变体(升序/降序)都只需翻转这个比较符号。
3. 陷阱拆解
a[j] < key:把条件写反了,排序会变成「小元素往右挤」,结果数组反而越排越乱,这是最典型的「条件反了」陷阱。a[j+1] > key:下标偷换了。j+1 是还没比较到的位置,此时访问 a[j+1] 要么越界,要么逻辑上没意义。a[j] == key:用等号会死循环——相等时不执行循环体,j 卡死在初始值,永远插不进位。4. 反命题思维 如果把条件改成 a[j] < key,算法会退化成降序插入排序,但时间复杂度不变;若把 a[j] > key 换成 a[j] >= key,稳定性会被破坏,相同元素会错位。下次遇到「填空写循环条件」的题,先反问自己:「这个条件到底是用来筛选什么元素?方向对不对?」——这才是破题的关键。