数组的众数问题的分治解法
来源:互联网 发布:微信客服系统 知乎 编辑:程序博客网 时间: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;
}
- 数组的众数问题的分治解法
- 数组的众数问题分治法解法
- 数组的众数问题的非分治解法
- NYOJ 众数问题的三种解法
- Majority Element众数元素的解法分析
- josephus 问题的数组解法
- 约瑟夫问题的数组解法
- 不用数组,解决众数问题(前提 :众数出现的次数必须大于n/2)
- 众数问题-递归和分治
- 分治法实现众数问题
- 众数问题(递归、分治)
- Java写的众数问题
- 分治法求解集合的众数及其重数
- RMQ问题的树状数组解法
- 最大子数组问题的分治算法
- 分治策略 & 最大子数组的问题
- 分治法求众数问题 (配图)
- 众数问题(递归分治策略)
- 一个简单的以User权限启动外部应用程序
- 零起点学习Linux菜鸟级别视频
- 最多约数问题
- ACM-ZOJ 1086 八进制小数转十进制 低位高精度除法初步认识
- 程序员进阶之道—快速理解设计
- 数组的众数问题的分治解法
- 自定义的tabBarController的几种方法
- Android近乎完美的中文日历兼备忘录软件 完美同步,农历、节日、天气、备忘录
- 冒泡排序算法原理及JAVA实现
- 八皇后问题1
- 自定义UINavigationBar和UISearchBar
- Power Designer逆向工程导入Oracle表,转为模型加注释
- Software Engineering
- 【C++&Java】构造函数的调用点