常用的有三种方法:
(假定数组下标从1开始存储数据)
第一种方法:
先对数组进行升序排序,再直接输出L(k)。最容易想到的也是最容易实现的,不过也是平均时间复杂度最大的,为O(nlog2n)。
第二种方法:
利用小根堆的特性,先线性时间内建立小根堆,再不断调整每次堆顶元素都是剩下序列中的最小元素。整体实现不算麻烦,平均时间复杂度为O(n+klog2n)。
第三种方法(好多文章没讲清楚具体怎样递归子区间):
从数组L[1…n]中选择枢轴pivot(或者随便选一个)进行和快速排序一样的划分操作后,表L[1…n]被划分为L[1…m-1]和L[m+1…n],其中L(m)=pivot.
接下来讨论m与k的关系:
①当m=k时,显然pivot就是所要寻找的元素,直接返回pivot即可。
②当m<k时,所要寻找的元素一定落在L[m+1…n]中,因此可对该子区间递归的查找第k-m小的元素。
③当m>k时,所要寻找的元素一定落在L[1…m-1]中,因此可对该子区间递归地查找第k小的元素。
该方法平均时间复杂度可达到O(n)。
进阶版:找出数组中第k小的数
最新推荐文章于 2024-07-27 14:37:39 发布