#include <stdio.h>
#include <stdlib.h>
void Zhong( int s[], int left,int right);
void Sort(int s[],int n);
int z=0 ;//众数
int c=0 ;//重数
int main()
{
int n,m,f;
FILE *fp=fopen("E:\\算法\\第2章分治策略实验包\\prog21众数问题\\test\\mode2.in","r");
if(fp==NULL)
{
printf("fp文件没有打开");
return 0;
}
fscanf(fp,"%d",&n);
printf("%d",n);
int s[n];
for(int i=0; i<n; i++)
{
fscanf(fp,"%d",&s[i]);
}
Sort(s,n);
printf("执行函数");
Zhong(s,0,n-1);
printf("执行完函数");
FILE *p=fopen("E:\\算法\\第2章分治策略实验包\\prog21众数问题\\answer\\mode2.out","r");
if(p==NULL)
{
printf("p文件没有打开");
return 0;
}
fscanf(p,"%d",&m);
fscanf(p,"%d",&f);
//printf("%d %d\n",m,f);
//printf("%d %d\n",z,c);
if(z==m&&c==f)
printf("YES");
else
printf("NO");
fclose(fp);
fclose(p);
return 0;
}
void Sort(int s[],int n)
{
int i,j,t;
for(i=0; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{
if(s[i]>s[j])
{
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
}
void Zhong( int s[], int left,int right)
{
// 找到中位数
int mid = s[(left + right) / 2];
// 与中位数相等的第一个数与最后一个数的位置
int left1 = 0, right1 = 0;
for (int i = left; i < right; i++)
{
if (s[i] == mid)
{
left1 = i;
break;
}
}
for (int i = left1; i < right; i++)
{
if (s[i] != mid)
{
right1 = i;
break;
}
}
if (c < right1 - left1 )
{
c = right1 - left1 ;
z = mid;
}
if (left1 > right1 - left1 )
{
Zhong(s, left, left1);
}
if (right - right1 > right1 - left1 )
{
Zhong(s, right1, right);
}
}
当mode2.in的内容为
50
6
3
7
1
11
3
15
3
10
3
12
5
14
7
1
8
5
6
13
11
3
14
7
7
5
10
14
12
12
4
14
10
5
11
1
15
11
3
12
3
12
15
5
5
11
14
4
3
11
9
时,mode2.out的内容为
3
8为什么程序不能正确执行,请用中文说明理由并改正这个程序