最大众数问题

来源:互联网 发布:如何优化淘宝排名 编辑:程序博客网 时间:2024/06/09 15:16
1)快速排序 (2)求中位数 (3)计算出中位数的最左端和最右端的位置,然后分割成2段数组 (4)中位数个数与左端个数比较,中<左  即最大众数可能存在左端,将左端再进行2段分割(递归)直到 中 >  左为止 右端同理。。。*/#include <stdio.h>#include <stdlib.h>int largest,element,a[101];int cmp(const void *a,const void *b){    return *(int *)a - *(int *)b;}int median(int a[],int left,int right)//求中位数{    return a[(left + right)/2];}void sqlit(int a[],int middle,int left,int right,int *ll,int *rr)//计算中位数个数最左端和最右端{    int i,j;    i = j = (left + right) / 2;    while(a[--i] == middle);   //寻找左端与中位数第一个相等的位置    *ll = i + 1;    //上面的i已经超出中位数,即后退一步    while(a[++j] == middle);//寻找右端与中位数最后一个相等的位置    *rr = j - 1;//上面的j已经超出中位数,即后退一步}void mode(int left,int right){    int ll,rr;    int middle = median(a,left,right);//求中位数    sqlit(a,middle,left,right,&ll,&rr);//分割数组    if(largest < rr - ll + 1)//寻找最大重数    {        largest = rr - ll + 1;        element = middle;    }    if(ll - left > largest)//左边的个数大于中位数的个数从左边再寻找        mode(left,ll - 1);    if(right - rr > largest)//右边的个数大于中位数的个数从右边再寻找        mode(rr + 1,right);}int main(){    int n,m,i;    scanf("%d",&n);    while(n--)    {        scanf("%d",&m);        for(i=0;i<m;i++)            scanf("%d",&a[i]);        qsort(a,m,sizeof(a[0]),cmp);        mode(0,m-1);        printf("%d %d\n",element,largest);    }    return 0;}
原创粉丝点击