给定一个数组,如何用最小的比较次数获得最大最小值
💡 类比:你有4个苹果,想找出最重和最轻的。
暴力法:先两两比重→选出最重的(3次),再两两比轻→选出最轻的(3次),总共6次。
✅ 优化方案:成对比较法(为什么更好?)
核心思想:
每次比较两个元素,同时得到这对元素的「最大」和「最小」
→ 用1次比较获取2个信息(而不是暴力法的1次比较只获取1个信息)
步骤详解(以[3, 5, 1, 2]为例):
第1步:分组比较(每组2个元素)
| 分组 | 比较 | 结果 | 说明 |
|---|---|---|---|
| (3, 5) | 3 vs 5 | 5 > 3 | → 这对的最大值=5,最小值=3 |
| (1, 2) | 1 vs 2 | 2 > 1 | → 这对的最大值=2,最小值=1 |
✅ 关键:2组共2次比较,得到4个信息(2个最大值+2个最小值)
第2步:比较所有「最大值」→ 找全局最大
- 有2个最大值:
5(来自第一组)和2(来自第二组) - 比较:
5 vs 2→5 > 2→ 全局最大值=5 ✅ 1次比较
第3步:比较所有「最小值」→ 找全局最小
- 有2个最小值:
3(来自第一组)和1(来自第二组) - 比较:
3 vs 1→3 > 1→ 全局最小值=1 ✅ 1次比较
✅ 总计比较次数:
- 分组比较:2次
- 比较最大值:1次
- 比较最小值:1次
→ 2 + 1 + 1 = 4次比较
💡 对比暴力法:4次 vs 6次 → 少2次!
📊 为什么这是最优解?(用公式证明)
计算公式:
- 当数组长度
n是偶数时:
总比较次数 =3n/2 - 2 - 当数组长度
n是奇数时:
总比较次数 =3(n-1)/2 - 1(先处理第一个元素)
