在O(n)时间范围内找出数组a[n]中位数相邻的k个数字
思路:简单的思路是先找出中位数(n+1)/2然后依次找第(n+1)/2-1小数字、(n+1)/2-2小数字、(n+1)/2-3.小数字。。。。(n+1)/2-k/2小数字,再找第(n+1)/2+1小数字、(n+1)/2+2小数字、(n+1)/2+3.小数字。。。。(n+1)/2+(k+1)/2小数字。但是该算法时间复杂度为O(kn)。
改进思路为:先找中位数,将数组按照中位数进行分割,数组的前半部分找第(n-1)/2-k/2小的数字,按照该数字对前半部分进行分割,则该数字到中位数之前的数字有k/2个数字,这些数字为与中位数相邻且小于中位数的前k/2个数字。数组的后半部分找出第(k+1)/2小的数字,然后按照该元素对后半部分进行分割,则中位数后一元素到该元素的(k+1)/2个元素为与中位数相邻且大于中位数的数字。该算法共调用三次分割选择函数Select,而该函数的时间复杂度为O(n),所以时间复杂度为O(n)。其具体代码如下:
//例题9.2中的算法的期望时间复杂度为O(n),而在9.3的例题中的最坏运行时间复杂度为O(n)。
//该算法实现思路是将数组每五个元素分为一组,最后一组可能不足五个。
//选出每一组中的中位数,然后选出这些中位数的中位数。根据这个中位数对数组进行划分为两组。
//然后再按