如何找N个数中第k小的数

  据说这是面试算法岗位中最常问的问题,各个面经里面出现这个问题的比率很高,今天的算法课讲了《算法导论》的第九章“中位数和顺序统计量”,9.2和9.3恰恰介绍的就是这个问题,这里做一下总结,说一下自己的理解。

  首先,接手这个问题最直接的想法莫过于排序了,常用的排序算法里面有冒泡排序、选择排序、插入排序、归并排序、堆排序、快速排序、计数排序、基数排序、桶排序等,虽然说快排的平均时间复杂度达到了O(nlgn),桶排序的平均时间复杂度达到了O(n)但是基于排序的方法对于这个问题并不是一个好的解决方法。O(nlgn)的排序就不说了,O(n)的排序前面隐含的常数因子也会被下面介绍的算法所打败。

  接下来会想到的方法,可能是对整个数组过k遍,每次都选择最小的,这样第k次就选到了第k小的,这样的话时间复杂度就成了O(kn),当k比较大时,仍然是不可接受的,万一k接近n/2呢,岂不是都O(n2)了。

  期望线性时间复杂度算法

  思考一下快排的PARTITION过程,经过多次左右互换,实现了针对于选定靶点A[k],左侧的元素都小于A[k],右侧的元素都大于A[k]。这个过程岂不是能用来帮助选点。

猜你喜欢

转载自www.cnblogs.com/liugl7/p/8955284.html
今日推荐