主题
第七章 查找、排序与选择问题
1. 为什么把查找、排序和选择放在一起
很多教材把排序单独成章,但如果从问题结构看,查找、排序、选择其实高度相关:
- 查找关心如何快速定位元素。
- 排序关心如何建立全局顺序。
- 选择关心如何只找出第
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) 结论就不成立。
