1.问题背景
杠铃增重问题
- 每位参赛运动员向组委会提交排好序的三次试举重量
- 为便于杠铃拆卸,组委会需对所有试举重量递增排序
杠铃增重顺序:125 130 132 123 127 129 117 121 126 116 120 122
问题:组委会如何根据试举重量安排杠铃增重顺序?
选择排序
- 从待排序元素中迭代选出最小值并排序
- 比较次数:???????? 次
插入排序
- 依次将每个元素插入到已排序序列之中
- 比较次数:???????? 次
杠铃增重问题
问题特点:局部有序
快速合并:比较两有序数组当前最小元素,将较小者逐一合入新数组
后续策略:
- 逐一合并:比较27次
- 两两合并:比较24次
| 策略名称 | 4位选手 | 8位选手 | 16位选手 |
|---|---|---|---|
| 逐一合并 | ???????? 次 | ???????????? 次 | ???????????? 次 |
| 两两合并 | ???????? 次 | ???????? 次 | ???????????? 次 |
求解杠铃增重问题的两两合并策略对排序问题有何启发?
2.从杠铃增重问题到排序问题
问题输入变化
- 完整数组输入
- 局部有序缺失
两两合并策略如何适应问题输入的变化?
- 解决输入变化:分解输入
3.归并排序
- 1945年,冯·诺伊曼提出归并排序
- 算法流程
- 将数组???? [???? , ????] 排序问题分解为???? [???? ,????/????]和???? [????/????+ ???? , ???? ]排序问题 分解原问题
- 递归解决子问题得到两个有序的子数组 解决子问题
- 将两个有序子数组合并为一个有序数组 合并问题解
归并排序名字由来:分解数组,递归求解,合并排序 分而治之
分解原问题 原问题分解成多个子问题
解决子问题 递归地求解各个子问题
合并问题解 将结果合并为原问题解
4.复杂度分析
- 递归树法:用树的形式表示抽象递归