问道赞吧主页,换了喜剧人,一路向西qvod
问题描述:给定由n个互不相同的数组成的集合s以及正整数k≤n,试设计一个o(n)时间算法找出s中最接近s的中位数的k个数。
算法描述:
算法实现:
selectorder函数、partition函数、sord函数同线性时间选择程序的算法实现,故略。 int main() { void sord(int a[],int h,int t); int selectorder(int x,int a[],int h,int t); int partition(int a[],int h,int t,int k); int n; scanf("%d",&n); int *a; a=(int *)malloc(sizeof(int)*n); for(int i=0;i<n;i++) a[i]=rand(); for(int i=0;i<n;i++) printf("%d ",a[i]); //动态分配数组a //随机生成数组a元素、输出 /* int n=7; int a[7]={0,-1,20,-4,-100,2000,2001}; for(int i=0;i<n;i++) printf("%d ",a[i]); */ printf("\n"); int middle; middle=selectorder((n-1)/2,a,0,n-1); printf("%d\n",middle); //找到数组a中的中位数并赋值给middle int *b; b=(int *)malloc(sizeof(int)*n); for(int i=0;i<n;i++) if(a[i]>=middle)b[i]=a[i]-middle; else b[i]=middle-a[i]; //动态分配数组b //数组b中元素=|数组a中元素-middle| int *c; c=(int *)malloc(sizeof(int)*n); for(int i=0;i<n;i++)c[i]=b[i]; //数组c中元素=数组b中元素 int k; scanf("%d",&k); //输入k int last; last=selectorder(k-1,b,0,n-1); //找到数组b中第k小元素并赋值给last for(int i=0;i<n;i++) if(c[i]<=last)printf("%d ",a[i]); //遍历数组c,如果数组c中元素小于last, //则输出对应位置上数组a的元素 printf("\n"); sord(a,0,n-1); for(int i=0;i<n;i++)printf("%d ",a[i]); return 0; }
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论