最坏情况为线性时间的选择算法
求给定输入中第k大的数的算法。 这是一个常见面试题,通常的解法也很明显,使用类似快排的思想。 每趟运行,把数组的值分成两部分,一部分比pivot大,一部分比pivot小,因为我们知道pivot在数组中的位置,所以比较k和pivot的位置就知道第k大的值在哪个范围,我们不断的进行recursion, 直到pivot就是第k大的值。 这个算法的时间预期是O(n)。这里需要注意的是讲的仅限于它的预期,对于这个算法,其在最差情况下,时间复杂度则为n的平法。 参阅 快速排序的无敌对手 一文,我们是可以构建出一个这样的序列的。最简单的情况,每趟快排的时候我们以第一个为主元,那么对于一个已经排序好的序列,我们要找最大的数,最后的时间花费就退化成了n的平方。 《算法导论》9.3章给出了一个最差情况也为线性O(n)的算法。 Step 1:把数组划分为若干个子数组,每个子数组里包含5个数,因为会有无法整除的可能,所以最后一个子数组会小于5. Step 2:用插入排序把这5个数排序,然后找出中位数,也就是第3个。 Step 3:把获得的中位数又排序 (这个地方错误,不是排序,应该递归调用SELECT) ,找出中位数的中位数x(如果有偶数个中位数,为了方便,约定x是较小的中位数)。 Step 4:把原来的数组使用类似快排的方法,分成两个部分。让k比划分的低区中的元素数目多1,因此x是第k小元素,并且有n