算法第二章实践作业
一. 找第 k 小的数的分治算法(快速选择,基于快排思想)
算法思想
- 在数组中选一个基准元素 pivot,把数组划分成两部分:左边所有元素 ≤ pivot,右边所有元素 ≥ pivot。划分完成后,基准元素就处在它最终的有序位置。
- 假设基准下标为
pos:
如果pos == k-1:pivot 就是第 k 小元素,直接返回;
如果pos > k-1:第 k 小元素落在左子区间,递归在左半部分查找;
如果pos < k-1:第 k 小元素落在右子区间,递归在右半部分查找,并且要找的变成第k-pos-1小。
二.时间复杂度分析
- 最好时间复杂度:(O(n))
- 最坏时间复杂度:(O(n^2))
三.对分治法的体会和思考
分治法核心思想:分、治、合。把一个规模大的原问题,分解成若干个结构相同、规模更小的子问题;递归求解子问题;最后合并子问题结果,得到原问题答案。
- 分:将大问题拆成独立的子问题,子问题和原问题规则一样,只是规模更小。像快速选择,每次划分数组,只需要继续在一侧子区间搜索。
- 治:递归解决子问题;子问题足够小时直接求解(递归出口)。
- 合:部分分治算法(归并排序)需要合并子问题结果;而快速选择这类算法,不需要合并,划分之后直接判断去哪一侧递归,“合” 的步骤省略。
浙公网安备 33010602011771号