1.问题
选择问题:
设L是n个元素的集合,从L中选取第k小的元素,其中1<=k<=n。这里的第k小的元素是指,当L按从小到大排好序之后,排在第k个位置的元素。
2.解析
采用特定分治策略:
3.设计
[核心伪代码]
int select(int A[],int left,int right,int k){
int n=right-left;//计算数组规模大小
if(n<5){
//数组规模小于5时直接调用二分归并排序输出结果
Merge_Sort(A,left,right-1);
return A[left+k-1];
}
//n>5
int i;
int t=n/5;//每5个元素分为一组,一共分为t组
int *p=new int[t];//定义一个指针变量p,开辟一块空间,大小为t个int类型,令p指向这块空间开头
for(i=0;i<t;i++){
//对每个5元组排序,排序后选出中位数数组
Merge_Sort(A,left+i*5,left+i*5+4);
p[i]=A[left+i*5+2];
}
Merge_Sort(p,0,i-1);//对选出的中位数数组再单独排序(不改变上一步的顺序)
int mid=p[i/2];//求出中位数数组的中位数mid
int *a1=new int[n];
int *a2=new int[n];
int *a3=new int[n];
int s1=0;
int s2=0;
int s3=0;
for(int<