-这个代码一直运行不出来结果,有没有人帮我看看哪里出了问题,谢谢大家啦
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中最大的元素称为众数。给定一个n个自然数组成的多重集合S,设计算法求其众数和重数。例如:给出 S = [1,2,3,4,5,2,2] S其众数是2,重数是3
分治法选取一个基准数,将比基准数小的放于左侧,比基准数大的放与右侧
计算基准数的重数
如果左半部分的元素个数大于基准数重数,递归求左半部分众数及其重数
如果右半部分的元素个数大于基准数重数,递归求右部分众数及其重数
三者中重数最大的是S的众数
本关的编程任务是用分治法编写求众数及其重数的函数
int GetMode(int a[],int p,int r,int &Count)
返回值为数组a[p]~a[r]之间的众数,参数Count存放众数对应的重数
#include
using namespace std;
void Swap(int &a,int &b)
{//交换函数
int c;
c = a;
a = b;
b = c;
}
int getMode(int a[],int p,int r,int &Cnt)
{
int k,y,Cnt1,Cnt2;
int i=p,j=r,m,x=a[p];
m=p;
y=0;
k=a[p];
Cnt1=0;
Cnt2=0;
while(true)
{
while(a[i]if(iSwap(a[i],a[m]);
m=i;
}
while(a[j]>=x)j--;
if(j>m)
{
Swap(a[j],a[m]);
m=j;
}
if(i>=j)break;
}
for(int i=p;i<=r;i++)
{
if(a[i]==a[m])y++;
}
if(m-p>y)
{
Cnt1=getMode(a,p,m,Cnt);
}
else
Cnt1=0;
if(r-m>y)
{
Cnt2=getMode(a,m,r,Cnt);
}
else
Cnt2=0;
if(Cnt1>y&&Cnt1>Cnt2)
{
Cnt=Cnt1;
}
else if(Cnt2>Cnt1&&Cnt2>y)
{
Cnt=Cnt2;
}
else
{
Cnt=y;
}
return a[m];
}
int main()
{
int n,Cnt,mode;
cin>>n;
int *a = new int[n];
for(int i = 0; i < n; i ++)
cin>>a[i];
mode = getMode(a,0,n-1,Cnt);
printf("%d%d",mode,Cnt);
return 0;
}
修改的主要内容:
在递归调用时,左半部分的元素个数应该是 m-p+1,右半部分的元素个数应该是 r-m。
在递归调用时,应该将 Cnt 传递给子函数,以便子函数能够更新重数。
在输出结果时,应该在两个数字之间加上一个空格。
在程序结束时,应该释放动态分配的数组空间。
我不是很理解你的意思,但是还是根据我的理解写一个C++代码
#include <iostream>
using namespace std;
int CountNum(int a[], int p, int r, int num) {
int count = 0;
for (int i = p; i <= r; i++) {
if (a[i] == num) {
count++;
}
}
return count;
}
int GetMode(int a[],int p,int r,int &Count) {
if (p == r) {
Count = 1;
return a[p];
}
int q = (p + r) / 2;
int Lmode, Rmode, Lcount = 0, Rcount = 0;
Lmode = GetMode(a, p, q, Lcount);
Rmode = GetMode(a, q + 1, r, Rcount);
int Mcount = CountNum(a, p, r, Lmode);
if (Lmode == Rmode) { // 相等
Count = Lcount + Rcount;
return Lmode;
} else if (Mcount > max(Lcount, Rcount)) {
Count = Mcount;
return Lmode;
} else if (Lcount > Rcount) {
Count = Lcount;
return Lmode;
} else {
Count = Rcount;
return Rmode;
}
}
int main() {
int n, Count;
cout << "请输入多重集合元素个数n: ";
cin >> n;
int* S = new int[n];
cout << "请输入多重集合的元素:";
for (int i = 0; i < n; i++) {
cin >> S[i];
}
int mode = GetMode(S, 0, n-1, Count);
cout << "多重集合的众数是:" << mode << endl;
cout << "众数的重数是:" << Count << endl;
delete[] S;
return 0;
}
首先,根据题目描述,我们需要使用分治法来解决这个问题。具体来说,我们需要实现一个函数GetMode,它的输入参数为一个整数数组a、数组的起始下标p、数组的结束下标r,以及一个引用参数Count,输出参数为数组a[p]~a[r]之间的众数,Count存放众数对应的重数。
下面是具体的思路:
首先,我们需要选取一个基准数x,将数组a中比x小的数放在左边,比x大的数放在右边。这可以使用快速排序算法中的Partition函数实现。
计算基准数x在数组a中出现的次数y。
如果数组a[p]a[m]中的元素个数大于y,则递归调用GetMode函数,求出a[p]a[m]中的众数,对应的重数为Cnt1。
如果数组a[m]a[r]中的元素个数大于y,则递归调用GetMode函数,求出a[m]a[r]中的众数,对应的重数为Cnt2。
比较Cnt1、Cnt2和y的大小,取其中最大值作为Count的值。
返回基准数x作为众数。
下面是具体的实现代码: