1.算法基本思想
分治法求众数和重数:利用分治算法先划分为若干个子问题,递归求解每一个子问题,最后将子问题合并,从而求解到整个问题的解。
2.主要数据结构及其作用
一维数组:存储并记录数据
3.测试用例
4.实验结果截图
测试用例1
测试用例2
测试用例3
5.代码实现
#include<iostream>
using namespace std;
void MergeSort(int a[],int l,int r)
{
if(l==r) return ;
int mid=(l+r)/2;
MergeSort(a,l,mid);
MergeSort(a,mid+1,r);
int lp=l,rp=mid+1,np=l;
int temp[r+1];
while(lp<=mid && rp<=r)
{
if(a[lp]>=a[rp])
{
temp[np++]=a[rp++];
}
else
{
temp[np++]=a[lp++];
}
}
while(lp<=mid) temp[np++]=a[lp++];
while(rp<=r) temp[np++]=a[rp++];
for(int i=l; i<=r; i++) a[i]=temp[i];
}
void Findx(int a[],int low,int high,int &x,int ×)
{
if(low>=high) return;
else
{
int x1=0,x2=0,times1=0,times2=0;
int mid=(low+high)/2;
Findx(a,low,mid,x1,times1);
Findx(a,mid+1,high,x2,times2);
int i=mid-1;
int j=mid+1;
times=1;
x=a[mid];
while(i>=low&&a[mid]==a[i])
{
i--;
times++;
}
while(j<=high&&a[mid]==a[j])
{
j++;
times++;
}
if(times<=times1)
{
x=x1;
times=times1;
}
if(times<=times2)
{
x=x2;
times=times2;
}
}
}
int main()
{
int n;
cout<<"请输入需要输入的元素的个数:"<<endl;
cin>>n;
int a[n],x,times;
cout<<"请输入"<<n<<"个元素:"<<endl;
for(int i=0; i<n; i++)
cin>>a[i];
MergeSort(a,0,n-1);
Findx(a,0,n-1,x,times);
cout<<"众数是: "<<x<<" 重数是: "<<times<<endl;
return 0;
}