数组 $\{45,66,23,1,10,97,52,88,5,33\}$ 进行从小到大冒泡排序过程中,第一遍冒泡过后的序列是( )。
答案A。选择排序每轮找最小值交换到前面。补全时要确保比较的是当前元素与当前最小值。
选择排序每轮找到最小值下标后与当前位置交换。注意比较的是数组元素值而不是下标。
【考点】冒泡排序|相邻元素比较|最大值下沉
命题人把这道题放在四级,就是卡住那些只会背"冒泡排序"四个字、却不会模拟相邻比较过程的考生。第一遍冒泡的核心规则是:每轮比较相邻元素,只要左侧大于右侧就交换,最终把本轮最大的数"赶"到末尾。
看到题先定位数组:{45,66,23,1,10,97,52,88,5,33}。从下标0到8依次比较:(45,66)不交换;(66,23)交换→{45,23,66,1,10,97,52,88,5,33};(66,1)交换→{45,23,1,66,10,97,52,88,5,33};(66,10)交换→{45,23,1,10,66,97,52,88,5,33};(66,97)不交换;(97,52)交换→{45,23,1,10,66,52,97,88,5,33};(97,88)交换→{45,23,1,10,66,52,88,97,5,33};(97,5)交换→{45,23,1,10,66,52,88,5,97,33};(97,33)交换→{45,23,1,10,66,52,88,5,33,97}。第一遍结束,97已归位,对应答案A。这一类题通法:不要急着看选项,先按冒泡规则从头到尾模拟一遍,记住"每遍把最大元素沉底"即可。
陷阱全在"局部交换"和"最大值定位"上。B选项{45,66,1,23,10,97,52,88,5,33}错在只交换了66和1就停了,显然66>1本该交换,但后面10和97位置不对——命题人故意把66和1的位置摆成"看起来像交换过",却把10和97的相对顺序搞反,诱导考生以为"只要调了一对就算完成"。C选项{45,66,23,1,10,52,88,5,33,97}错在把66和23交换后,66却停在原位置——冒泡要求每轮把最大元素一直推到末尾,这里66明明比23大却"卡住"了,说明只交换了一对。D选项{45,66,23,1,10,97,52,88,33,5}错在把97提前到中间,而5被沉到末尾——97才是最大值,第一遍应该沉到最后一位,命题人用97的位置来迷惑那些只关注"交换次数"的考生。最阴险的是D,它把97放在中间,5放在末尾,看起来像"交换了97和5",但97>5本不该交换,这里偷换了比较规则,只把相邻元素按大小排序,却忽略了冒泡的"每一轮"特性。
反命题思维:如果把题改成"第二遍冒泡过后的序列",答案会变成{23,1,10,45,52,66,5,33,97}(因为45会沉到倒数第二);如果改成"冒泡排序总交换次数",需要累加每一轮交换数,共11次;如果改成"快速排序第一趟主元为45",序列会完全不同。刷到类似题时先问:"命题人想考我哪一步?"是考最大值定位,还是考交换规则,还是考多轮模拟?