(共27个数)(代码中为100个数,为了放得下举的例子改为27个)
Typea[]数组a
intp起始位置
intr结束位置
intk查找第k小
三、判断
元素个数<75不需要线性选择--》直接进行冒泡排序返回a[p+k-1](第k小元素)
元素个数>75进行线性选择--》进行下一步
1-分组并取各组中位数(将元素每5个分成一组,分别排序,并将该组中位数与a[p+i]交换位置)【图中绿线12345表示要交换的一对对数据】
for(inti=0;i<=(r-p-4)/5;i++){BubbleSort(a,p+5*i,p+5*i+4);Swap(a[p+5*i+2],a[p+i]);}
目的:使所有组的中位数都排列在数组最左侧,以便进一步查找中位数的中位数
2-查找中位数的中位数
Typex=Select(a,p,p+(r-p-4)/5,(r-p-4)/10);
p到p+(r-p-4)/5为中位数的范围,p+(r-p-4)/5÷2=(r-p-4)/10-->中位数的中位数
----------------------------------------------------------------------------------------------------------
3-用找到的中位数的中位数做为快速排序的标准进行一趟快速排序(前面有篇讲的快速排序为了方便直接用第一个做标准,也有用随机数做标准的)
i=Partition(a,p,r,x);
排序结束后,标准元素将数组分为三部分:左,标准元素,右。
------------------------------------------------------------------------------------------------------------
4-判断
快速排序后看成三部分:左,标准元素,右。
所以判断下我们要找的第k小是比它大(在右)还是比它小(在左);
intj=i-p+1;if(k<=j){returnSelect(a,p,i,k);}else{returnSelect(a,i+1,r,k-j);}
i为快速排序返回值,j=i-起始位置+1;
小于或者等于,对左半段重复上述操作(递归);
反之,对右半段。
-----------------------------------------------------------------------------------------------------------------
[特例]
有空更新。。。
[总结]
快速排序中的标准元素变为————>>分组后取得的各组中位数的中位数。
所以多了一步取中位数的操作而已。
本人保留解析著作权。
算法引用自王晓东.计算机算法设计与分析[M].电子工业出版社,2012.