您的位置:首页 > 其它

数组的众数问题的非分治解法

2009-12-06 13:34 288 查看
★问题描述:
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。
例如,S={1,2,2,2,3,5}。
多重集S的众数是2,其重数为3。
★编程任务:
对于给定的由n个自然数组成的多重集S,编程计算S的众数及其重数。
★数据输入:
输入数据由文件名为input.txt的文本文件提供。文件的第1行多重集S中元素个数n;接下来的n行中,每行有一个自然数。
★结果输出:
程序运行结束时,将计算结果输出到文件output.txt中。输出文件有2行,第1行给出众数,第2行是重数。
输入文件示例 输出文件示例
input.txt output.txt
6 2
1 3
2
2
2
3
5

///////////////////////////////////////

由于懒得建文件我就不用文件啦,

#include<iostream>
using namespace std;
//结构体用来保存众数的元素与重数
typedef struct
{
int element;//元素
int sum;//重数
}zs;
//快排
void sort(int a[],int s,int t)//对a[s]到a[t]的元素排序
{
int i=s,j=t;
int temp;
if(s<t)//区间里至少存在一个元素的情况
{
temp=a[s];//用区间的第一个元素做基准
while(i!=j)//区间两端交替向中间扫描,知道I=J
{
while(j>i&&a[j]>temp)
j--;//从右向左扫描,找到第一个小于temp的a[j]
if(i<j)//表示找到a[j],则a[i],a[j]交换
{
a[i]=a[j];
i++;
}
while(i<j&&a[i]<temp)
i++;//从左向右扫描,找到第一个大于temp的a[i]
if(i<j)//表示找到a[i],则a[i],a[j]交换
{
a[j]=a[i];
j--;
}
}
a[i]=temp;
sort(a,s,i-1);//对左递归
sort(a,i+1,t);//对右递归
}
}
int main()
{
zs m,h;
m.sum=1;//
h.sum=1;//
int a[]={1,2,2,3,3,3,4,8,4,7,5,6,7,6,3};
int n=sizeof(a)/sizeof(a[0]);
cout<<"数组的个数为:"<<n<<endl;
sort(a,0,n-1);
cout<<"快排后的数组元素为:"<<endl;
for(int i=0;i<n;i++)
{
if(h.sum>m.sum)
{
m.sum=h.sum; // m.sum=h.sum;//用来保存当前的重数大小
m.element=h.element; // m.element=h.element;//保存当前元素
}
if(a[i+1]==a[i])
{
h.sum++;
h.element=a[i];
}
else
{
h.sum=1;
}

cout<<a[i]<<" ";
//cout<<endl;
}
cout<<endl;
cout<<"众数的元素为:"<<m.element<<" 众数的重数为:"<<m.sum<<endl;

return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: