汪彩萱

第二章实践作业

找第 k 小的数的分治算法
借用快排划分的思路。选一个基准数,通过交换把小于它的放左边,大于它的放右边,让基准数归位。看基准数的排名:如果正好是第 k 个,它就是答案;如果排名大于 k,就递归去左边找;如果排名小于 k,就递归去右边找,注意把 k 减去左半边的元素个数。只往一边递归,找到直接返回,不用合并。
最好和最坏时间复杂度
最好情况 O(n)
O(n):第一次选的基准数刚好就是第 k 小,只需遍历一遍数组,不用全排序。
最坏情况 O(n2)
O(n 2):数组有序且每次都取第一个当基准时,每次只能排除一个元素,要递归 n 次,时间退化成平方级。实际可以随机选基准来避免。
对分治法的体会和思考
分治法就是把大问题拆成小问题。这道题让我发现,分治不一定非要合并。快排要两边都排好,而找第 k 小只要判断目标在哪边,另一边直接丢掉,只处理一半,效率很高。另外递归时 k 怎么传、边界怎么设一定要想清楚,不然容易死循环或越界。分治法代码干净,但递归太深也会占内存,实际使用要权衡

posted on 2026-10-11 23:54  汪彩萱  阅读(3)  评论(0)    收藏  举报

导航