Appearance
题目
对初始数据序列 (8, 3, 9, 11, 2, 1, 4, 7, 5, 10, 6) 进行希尔排序。若第一趟排序结果为 (1, 3, 7, 5, 2, 6, 4, 9, 11, 10, 8),第二趟排序结果为 (1, 2, 6, 4, 3, 7, 5, 8, 11, 10, 9),则两趟排序采用的增量(间隔)依次是( )。
错因
A
把"第二趟增量 1"等同于"已经做完最后一趟"。增量为 1 的希尔排序就是普通直接插入排序,做完之后整个序列必然是有序的。但题目给出第二趟结果 (1, 2, 6, 4, 3, 7, 5, 8, 11, 10, 9) 还远没到有序,所以增量不可能是 1。选 A 的人没用" 必出有序结果"这条快速反证。
B
第一趟增量 3 是错判。3 阶分组下,原序列下标 0,3,6,9 一组(8,11,4,10 → 排序得 4,8,10,11)、下标 1,4,7,10 一组(3,2,7,6 → 2,3,6,7)、下标 2,5,8 一组(9,1,5 → 1,5,9)。合成第一趟结果应是 (4,2,1,8,3,5,10,6,9,11,7),与题目给的 (1,3,7,5,2,6,4,9,11,10,8) 完全对不上。选 B 的同学多半没真正分组验算,凭"3 是希尔排序常见增量"就选了。
C
第二趟增量 2 也对不上。如果第二趟是 ,会按下标奇偶分两组(共 6+5 个元素),分别做直插排序。把第一趟结果 (1,3,7,5,2,6,4,9,11,10,8) 按 分组并排序后得 (1,3,2,5,4,6,7,9,8,10,11)——前面段已经基本递增了,跟题目给的第二趟 (1,2,6,4,3,7,5,8,11,10,9) 差很多。说明第二趟不可能是 2。
总解析
希尔排序的判定关键:增量 把序列按 i mod d 分成 组,组内做直接插入排序。给出某趟前后的结果,反推增量就是逐个候选 验证"按 分组之后,每一组在该趟之后应当组内有序"。
记原始序列 (下标 0–10):
位置: 0 1 2 3 4 5 6 7 8 9 10
A0: 8 3 9 11 2 1 4 7 5 10 6第一趟结果 。
反推第一趟增量 :试 ,按 i mod 5 分 5 组:
| 组(下标) | 的值 | 排序后 | 写回 |
|---|---|---|---|
| 8, 1, 6 | 1, 6, 8 | 位置 0, 5, 10 = 1, 6, 8 | |
| 3, 4 | 3, 4 | 位置 1, 6 = 3, 4 | |
| 9, 7 | 7, 9 | 位置 2, 7 = 7, 9 | |
| 11, 5 | 5, 11 | 位置 3, 8 = 5, 11 | |
| 2, 10 | 2, 10 | 位置 4, 9 = 2, 10 |
合成:(1, 3, 7, 5, 2, 6, 4, 9, 11, 10, 8) —— 与题给第一趟结果完全一致 ✓,故 。
反推第二趟增量 :在 上试 ,按 i mod 3 分 3 组:
| 组(下标) | 的值 | 排序后 | 写回 |
|---|---|---|---|
| 1, 5, 4, 10 | 1, 4, 5, 10 | 位置 0, 3, 6, 9 = 1, 4, 5, 10 | |
| 3, 2, 9, 8 | 2, 3, 8, 9 | 位置 1, 4, 7, 10 = 2, 3, 8, 9 | |
| 7, 6, 11 | 6, 7, 11 | 位置 2, 5, 8 = 6, 7, 11 |
合成:(1, 2, 6, 4, 3, 7, 5, 8, 11, 10, 9) —— 与题给第二趟结果完全一致 ✓,故 。
快速排除小诀窍:希尔排序只要见到增量为 1 的那一趟,结果必为完全有序。题目给的第二趟还没排完,所以 ,A 选项当场就能丢。
最终答案是 D(5, 3)。