一、实验目的
1、理解递归的概念和分治法的基本思想
2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法
3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法
二、问题描述
P39,算法实现题2-1.众数问题:给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。
对于给定的由n个自然数组成的多重集S,计算S的众数及其重数。
- 输入
输入数据由文件名为input.txt的文本文件提供。文件的第1行为多重集S中元素个数n;在接下来的n行中,每行有一个自然数。
如:
6
1
2
2
2
3
5
- 输出
将计算结果输出到文件output.txt。输出文件有2行,第1行是众数,第2行是重数。
如上例输出为
2
3
- 数据结构
数据的逻辑结构:数组a[],b[]
物理存储结构:顺序存储结构
数据的基本操作:查找,遍历,查找。
六、算法设计
#include <stdio.h>
int main()
{
int i,j,n;
printf("数组中有多少数\n");
scanf("%d", &n);
int a[100], b[100] = {0};
printf("输入\n");
for ( i =0; i < n; i++)
{
scanf("%d", &a[i]);
for ( j =0; j < n; j++)
{
if (a[i] == a[j])
{
b[i]++; //记录每一个数据出现的次数
}
}
}
int max = b[0], most= a[0]; //定义最大次数,和众数
for ( i = 0; i < n; i++)
{
if (b[i] > max) //次数比最大还大重新赋值
{
max = b[i];
most= a[i];
}
else if (b[i] == max && a[i] <most)//次数相等且数字小
{
max=b[i];
most=a[i];
}
}
printf("众数是%d\n重数是%d\n", most, max);
return 0;
}
七、实验结果
八、实验心得
通过递归分治算法能够将一个难以直接解决的大问题分割成一些规模比较小的相同问题,以便各个击破,能够使函数的定义和算法描述更加简捷且更加容易理解。能够使设计出的算法简捷且易于理解。