实验报告
课程名称 《算法分析与设计》 实验日期 2021年3月8日 至 2021年 3 月 15 日
学生姓名 戴子博 所在班级 计算机194 学号 2019212212130
实验名称 选第k小元素:特定分治策略
实验地点 寝室 同组人员
1.问题
再有n个整数的数组S中,选第k小的元素
2.解析
3.设计
int select(int a[],int left,int right,int k){
int n=right-left;
if(n<=5){
MergeSort(a,left,right);
return a[left+k];
}
int t=n/5;
int m[t];
for(int i=0;i<t;i++){
MergeSort(a,left+i*5,left+i*5+5);
m[i]=a[left+i*5+2];
}
MergeSort(m,0,t);
int mid=m[t/2];
int a1[n],a2[n],a3[n];
int s1=0,s2=0,s3=0;
for(int i=left;i<right;i++){
if(a[i]<mid){
a1[s1++]=a[i];
}
else if(a[i]==mid){
a2[s2++]=a[i];
}
else{
a3[s3++]=a[i];
}
}
if(s1>=k){
return select(a1,0,s1,k);
}
if(s1+s2>=k){
return mid;
}
else
return select(a3,0,s3,k-s1-s2);
}
4.分析
5.源码
博客地址:https://blog.csdn.net/shaojinfu?spm=1000.2115.3001.5343
github源码地址:https://github.com/CNFierceman/Algorithm_homework.git