递归与分治策略——众数问题

问题

  • 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。对于给定的由n个自然数组成的多重集S,计算S的众数及其重数。

代码

  • 排序法
#include <stdio.h>
#include <stdlib.h> 
int main()
{        
    int a[100]={-1},n=0,i=0,max=0,s=0,t=0,j=0;        
    scanf("%d",&n);//输入数组 长度        
    for(;i<n;i++)       
    {                
        scanf("%d",&a[i]);//输入数组元素值        
    }        
    for(j=0;j<n-1;j++)//排序,每次找到最小值,循环进行        
    {                
        for(i=j+1;i<n;i++)                
        {                        
            if(a[j]>a[i])                        
            {                                
                t=a[j];                                
                a[j]=a[i];                                
                a[i]=t;                        
            }                
        }       
    }        
    s=1;        
    t=a[0];       
    for(i=1,j=0;i<n;i++)//遍历数组        
    {                
        if(a[i]==a[i-1])                       
            s=s+1;//若数组元素a[i]==a[i-1],对应的个数s加1                
        else                        
            s=1;//否则,s置1                
        if(max<s)//若s>max,将s赋给max,a[i]赋给t                
        {                        
            max=s;                        
            t=a[i];                
        }        
    }        
    printf("%d %d",t,max);//输出众数t,个数s
}
  • 用空间换时间
#include <stdio.h>
#include <stdlib.h> 
int main()
{        
    int a[100]={-1},b[100]={0},n=0,i=0,j=0,t=0,s=0;        
    scanf("%d",&n);//输入数组 长度        
    for(;i<n;i++)        
    {                
        scanf("%d",&a[i]);//输入数组元素值        
    }        
    for(i=0;i<n;i++)        
    {                
        for(j=0;j<n;j++)                
        {                       
            if(a[i]==a[j])//循环判断数组元素个数并存储到b[i]                           
            b[i]++;                
        }        
    }        
    for(i=0;i<n-1;i++)       
    {                
        for(j=i+1;j<n;j++)                
        {                        
            if(b[j]>b[i])//循环比较找到最大的个数值t                                                  //以及众数所在数组下标s                        
            {                                
                t=b[j];                                
                s=j;                        
            }                
        }        
    }        
    printf("%d %d",a[s],t);//输出众数a[s],个数t
}
    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/imumuK/article/details/85064271
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞