Skip to content

2012年 408 数据结构 第 10 题

数据结构2012年选择题2分

题目

在内部排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一趟排序。下列排序方法中,每一趟排序结束都至少能够确定一个元素最终位置的方法是( )。

Ⅰ. 简单选择排序

Ⅱ. 希尔排序

Ⅲ. 快速排序

Ⅳ. 堆排序

Ⅴ.二路归并排序

错因

B

把归并排序当成"每趟有元素就位"。归并排序的中间趟(如 8 路归并 → 4 路 → 2 路)只是把局部段合并成更长有序段,这些段内的元素相对于全局还没排好。只有最后一趟(合成全局有序)所有元素才同时就位,前面的趟都不算。

C

把希尔排序当对(错),把简单选择排序漏掉。希尔排序前面几趟用大增量分组做插入排序,只在组内排好序,组与组之间没保证全局位置——不属于"每趟必有元素就位"的算法。

D

漏选简单选择排序(明显属于"每趟选最小放到末尾",每趟必就位 1 个),又把归并选进来(错,原因同 B)。

总解析

判定标准:每一趟排序结束后,是否至少有一个元素到达它在最终有序序列中的位置(且后续不再变动)?

逐项判定:

Ⅰ 简单选择排序 ✓

每趟从未排序部分选出最小(或最大)元素,放到当前的最前(或最后)位置。 趟结束后,第 小的元素就在第 个位置上,永远不再变动。每趟必就位 1 个。

Ⅱ 希尔排序 ✗

希尔排序是"分组插入排序",前几趟用大步长(如 5、3)分成多组,组内用直接插入排序。组内有序 ≠ 全局有序,元素的位置在后续趟中还会被调整。直到最后一趟步长为 1 才退化为普通插入排序,使全局有序——前面所有趟都不能保证有元素就位。

Ⅲ 快速排序 ✓

每一趟(每次 partition)选枢轴划分,枢轴会被放到它在最终序列中的精确位置(左边都比它小、右边都比它大)。每趟必就位至少 1 个(枢轴本身)。

Ⅳ 堆排序 ✓

每一趟取堆顶(大顶堆下是最大值),与最末元素交换,然后调整剩余部分重建堆。取出的堆顶元素就放在它的最终位置(最大值最后、次大值倒数第二,依此类推)。每趟必就位 1 个。

Ⅴ 二路归并排序 ✗

中间趟数中归并出的"局部有序段"不是元素的最终位置——同一段内的元素相对全局来看还不知道在哪一档。直到最后一趟才全部就位,前面的趟都不能保证任何元素到位

正确的是 Ⅰ、Ⅲ、Ⅳ。最终答案是 A

速记:选择 / 快排 / 堆排都属于"选择类"思想——每趟挑出一个"极值"放最终位置;插入类(直接插入、希尔)和归并类(归并)则不是这个套路。

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题