编程之美---寻找最大的K个数

来源:互联网 发布:web前端和java哪个好 编辑:程序博客网 时间:2024/05/01 20:57

问题详见《编程之美》

其基本思想是在达到目的的前提下,尽量地减少排序、选择的工作量

解法二code

/*在一组数中寻找k个较大的数*/#include <stdio.h>#include <stdlib.h>#define A 10int s[A]={10,2,34,4,5,-1,36,73,8,92};int k=4;void swap(int s[],int l,int m)//交换数据确立边界{int temp;temp=s[l];s[l]=s[m];s[m]=temp;return;}/*数组分割函数---基本思想是快速排序法输入参数:@s 等待分配的数组@l 数组的左边界@r 数组的右边界    @k 数组中s从l开始,期望分割出的左数组的大小*/void partition(int s[],int l,int r,int k)//二分组递归程序{int border;int i,j;int cntl=0,cntr=0;swap(s,l,(l+r)/2);border=s[l];i=l;j=r;while(i<j){while(i<j && s[j]<border){j--;cntr++;}s[i]=s[j];while(i<j && s[i]>=border){i++;cntl++;}s[j]=s[i];}s[i]=border;cntl++;if(cntl>k)//分组后若大数数量大于k值,则重分左边数组{partition(s,l,i,k);}else if(cntl<k)//分组后若大数数组小于k值,则重分右边数组{partition(s,i+1,r,k-cntl);}else{return;}}int main(void){int i;partition(s,0,A-1,k);printf("The k max value int set s are:\n");for(i=0;i<k;i++){printf("%d ",s[i]);}printf("\n");system("pause");return 0;}



0 0
原创粉丝点击