Skip to content

第七章 查找、排序与选择问题


1. 为什么把查找、排序和选择放在一起

很多教材把排序单独成章,但如果从问题结构看,查找、排序、选择其实高度相关:

  1. 查找关心如何快速定位元素。
  2. 排序关心如何建立全局顺序。
  3. 选择关心如何只找出第 k 小或第 k 大,而不必完成全部排序。

它们共同围绕“有序性如何被利用或建立”展开,因此放在一起更有助于形成整体视角。

2. 二分查找:有序数组的代表性操作

二分查找适用于有序数组或有序切片。它的思想不是从头扫描,而是每次比较中点,把搜索区间减半。

go
func BinarySearch(nums []int, target int) int {
    left, right := 0, len(nums)-1
    for left <= right {
        mid := left + (right-left)/2
        if nums[mid] == target {
            return mid
        }
        if nums[mid] < target {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return -1
}

二分查找的关键前提只有一个:数据必须有序。没有这个前提,它的 O(log n) 结论就不成立。

3. 排序算法关注的四个维度

4. 插入排序:局部有序逐步扩展

5. 归并排序:分治与稳定性的典型代表

6. 快速排序:局部划分,整体逼近

7. 堆排序:利用堆序结构完成排序

8. 稳定性为什么重要

9. 选择问题:不必全排,只找第 k

10. 排序算法比较

11. 本章常见误区

12. 本章小结

13. 图解版补充