Appearance
题目
在内部排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一趟排序。下列排序方法中,每一趟排序结束都至少能够确定一个元素最终位置的方法是( )。
Ⅰ. 简单选择排序
Ⅱ. 希尔排序
Ⅲ. 快速排序
Ⅳ. 堆排序
Ⅴ.二路归并排序
错因
B
把归并排序当成"每趟有元素就位"。归并排序的中间趟(如 8 路归并 → 4 路 → 2 路)只是把局部段合并成更长有序段,这些段内的元素相对于全局还没排好。只有最后一趟(合成全局有序)所有元素才同时就位,前面的趟都不算。
C
把希尔排序当对(错),把简单选择排序漏掉。希尔排序前面几趟用大增量分组做插入排序,只在组内排好序,组与组之间没保证全局位置——不属于"每趟必有元素就位"的算法。
D
漏选简单选择排序(明显属于"每趟选最小放到末尾",每趟必就位 1 个),又把归并选进来(错,原因同 B)。
总解析
判定标准:每一趟排序结束后,是否至少有一个元素到达它在最终有序序列中的位置(且后续不再变动)?
逐项判定:
Ⅰ 简单选择排序 ✓
每趟从未排序部分选出最小(或最大)元素,放到当前的最前(或最后)位置。第 趟结束后,第 小的元素就在第 个位置上,永远不再变动。每趟必就位 1 个。
Ⅱ 希尔排序 ✗
希尔排序是"分组插入排序",前几趟用大步长(如 5、3)分成多组,组内用直接插入排序。组内有序 ≠ 全局有序,元素的位置在后续趟中还会被调整。直到最后一趟步长为 1 才退化为普通插入排序,使全局有序——前面所有趟都不能保证有元素就位。
Ⅲ 快速排序 ✓
每一趟(每次 partition)选枢轴划分,枢轴会被放到它在最终序列中的精确位置(左边都比它小、右边都比它大)。每趟必就位至少 1 个(枢轴本身)。
Ⅳ 堆排序 ✓
每一趟取堆顶(大顶堆下是最大值),与最末元素交换,然后调整剩余部分重建堆。取出的堆顶元素就放在它的最终位置(最大值最后、次大值倒数第二,依此类推)。每趟必就位 1 个。
Ⅴ 二路归并排序 ✗
中间趟数中归并出的"局部有序段"不是元素的最终位置——同一段内的元素相对全局来看还不知道在哪一档。直到最后一趟才全部就位,前面的趟都不能保证任何元素到位。
正确的是 Ⅰ、Ⅲ、Ⅳ。最终答案是 A。
速记:选择 / 快排 / 堆排都属于"选择类"思想——每趟挑出一个"极值"放最终位置;插入类(直接插入、希尔)和归并类(归并)则不是这个套路。