C语言分治法求解众数重数问题

-这个代码一直运行不出来结果,有没有人帮我看看哪里出了问题,谢谢大家啦
给定含有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;
}


以下内容部分参考ChatGPT模型:


首先,根据题目描述,我们需要使用分治法来解决这个问题。具体来说,我们需要实现一个函数GetMode,它的输入参数为一个整数数组a、数组的起始下标p、数组的结束下标r,以及一个引用参数Count,输出参数为数组a[p]~a[r]之间的众数,Count存放众数对应的重数。

下面是具体的思路:

  1. 首先,我们需要选取一个基准数x,将数组a中比x小的数放在左边,比x大的数放在右边。这可以使用快速排序算法中的Partition函数实现。

  2. 计算基准数x在数组a中出现的次数y。

  3. 如果数组a[p]a[m]中的元素个数大于y,则递归调用GetMode函数,求出a[p]a[m]中的众数,对应的重数为Cnt1。

  4. 如果数组a[m]a[r]中的元素个数大于y,则递归调用GetMode函数,求出a[m]a[r]中的众数,对应的重数为Cnt2。

  5. 比较Cnt1、Cnt2和y的大小,取其中最大值作为Count的值。

  6. 返回基准数x作为众数。

下面是具体的实现代码:


如果我的建议对您有帮助、请点击采纳、祝您生活愉快