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

来源:互联网 发布:微信客服系统 知乎 编辑:程序博客网 时间:2024/05/17 20:22

★问题描述:
给定含有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>
#include<fstream>
using namespace std;
//结构体用来保存众数的元素与重数
typedef struct
{
 int element;//元素
 int sum;//重数
}zs;
//记录中位数的起始下标
typedef struct
{
 int low;
 int high;
}node;
//快排
zs x;
//int data=1;
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 madian(int *a,int l,int r)
{
 int x=r+l+1;
 // if(x%2)
 return a[x/2];//为奇数时
 // else
 //  return (a[x/2]+a[x/2+1])/2;//为偶数时
}
//返回中位数的起始点
node spalit(int *a,int med,int l,int r)
{
    node m;
    m.low=l;m.high=r;
    for(int i=0;i<=r;i++)
 {
  if(med==a[i])
  {
   m.low=i;
   break;
  }
 }
 for(int j=r;j>=0;j--)
 {
  if(med==a[j])
  {
   m.high=j;
   break;
  }
 }
 return m;
}
//众数的重数求取
void mode(int *a,int l,int r)
{
 
 if(l>=r)return;
 //x.sum=0;
 else
 {
  node n;
          int temp=0;
  int med;
  med=madian(a,l,r);
  n=spalit(a,med,l,r);
  temp=n.high-n.low+1;
  if(x.sum<temp)
  {
   x.element=med;
   x.sum=temp;
  }
  if(n.low-l>temp)//
  {
   if(x.sum<temp)
   {
    x.element=med;
    x.sum=temp;
   }
   mode(a,l,n.low-1);
  }
  if(r-n.high>temp)
  {
   if(x.sum<temp)
   {
    x.element=med;
    x.sum=temp;
   }
   mode(a,n.high+1,r);
  }
 }
}
void main()
{
 x.sum=0;
 int n;
 int *a;
 ifstream in("C://inputdate.txt");
 if(!in)
 {
 cout<<"the file can't open!"<<endl;
 }
 in>>n;
 a=new int[n];
 for(int i=0;i<n;i++)
 {
 in>>a[i];
         }
 sort(a,0,n-1);
 mode(a,0,n-1);
 cout<<x.element<<" "<<x.sum<<endl;
 delete []a;
}


 

原创粉丝点击