查找数组元素的最大值和最小值众数问题Word格式.docx
《查找数组元素的最大值和最小值众数问题Word格式.docx》由会员分享,可在线阅读,更多相关《查找数组元素的最大值和最小值众数问题Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
●采用同样的处理方法递归处理以分好的数据集。
2.1.2细节处理:
●数组的大小为
,n=0,1,2,3......
●数组中的数字随机产生,数字的范围为1~100;
●静态全局变量:
max的初值为0,min的初值为101。
2.2众数问题
2.2.1快速排序算法:
●设置两个变量i、j,排序开始的时候:
i=left,j=right+1;
●以第一个数组元素作为关键数据,赋值给temp,即temp=array[left];
●从j开始向前搜索,即由后开始向前搜索(--j),找到第一个小于temp的值array[j];
●从i开始向后搜索,即由前开始向后搜索(++i),找到第一个大于temp的array[i];
●交换array[i]和array[j]的值;
●重复搜索步骤,直到i=j;
●将temp的值和array[j]的值交换,并以此为界,分别在对左右两边进行快速排序。
3.核心代码
3.1查找最值
3.1.1流程图(如图1)
(核心函数为voidMaxAndMin(intarray[N],intleft,intright)):
图1.查找最值的流程图
3.1.2核心代码如下:
(注:
max和min是静态全局变量)
voidMaxAndMin(intarray[N],intleft,intright)//求最大值最小值函数,分治递归法
{
intmid;
//数组的分界点
if((left+1)==right)//分治的数组只有两个值时,更新max和min的值
{
if(array[left]<
array[right]&
&
max<
array[right])//判断、更新最大值
max=array[right];
if(array[left]>
array[left])
max=array[left];
min>
array[left])//判断、更新最小值
min=array[left];
array[right])
min=array[right];
}
else
mid=(left+right)/2;
//对数组进行分治
MaxAndMin(array,left,mid);
//对左边的数组进行分治递归
MaxAndMin(array,mid+1,right);
//对右边的数组进行分治递归
}
3.2众数问题
3.2.1流程图(如图2)
图2.众数问题的流程图
3.2.2核心代码如下:
voidquickSort(int*array,intleft,intright)//用快速排序法排序数组
if(left<
right)
inti=left,j=right+1;
inttemp=array[left];
//以第一个数为基准
while(true)
{
while(array[++i]<
temp&
i<
right);
//从前面找大于基准的数
while(array[--j]>
temp);
//从后面找小于基准的数
if(i>
=j)//当left>
right时停止
break;
swap(array[i],array[j]);
//交换两值
}
array[left]=array[j];
array[j]=temp;
intpart=j;
//以靠左的较小值为界,对左右两部分数继续快排
quickSort(array,left,part-1);
quickSort(array,part+1,right);
4.运行与调试
4.1查找数组最值
产生随机数组并排序:
(如图3、图4、图5)
图3.随机数组之一及结果
图4.随机数组之二及结果
图5.随机数组之三及结果
4.2众数问题
4.2.1只有一个众数(如图6、图7)
图6.只有一个众数的数组图7.只有一个众数的结果
4.2.2没有众数(如图8、图9)
图8.没有众数的数组图9.没有众数的结果
4.2.3有两个众数(如图10、图11)
图10.有两个众数的数组图11.有两个众数的结果
5.结果分析和小结
5.1结果分析:
通过设置不同的测试数据及运行的结果,可以看出程序的算法思想是正确的,程序的运行也是有效的,全面的。
5.2实验的收获、心得体会:
通过对于这两个题目的分析和设计,我正确的掌握了分治算法的思想,以及使用分治算法来解决不同的问题,对程序的设计思想有了更好、更深的练习。
附录(C/C++源代码)
1、查找数组最大、最小值
//程序默认数组的大小值为2的幂,随机数的范围是1~100
#include<
stdio.h>
stdlib.h>
time.h>
#defineN8//数组的大小
staticintmax=0;
//存储最大值
staticintmin=101;
//存储最小值
voidCreateArray(int*);
voidShowArray(int*);
voidMaxAndMin(int*,int,int);
voidmain()
intarray[N];
CreateArray(array);
printf("
产生的随机数组为:
\n"
);
ShowArray(array);
MaxAndMin(array,0,7);
该数组的最大值为:
%d,最小值为:
%d\n"
max,min);
voidMaxAndMin(intarray[N],intleft,intright)//求最大值最小值函数,分治递归法
if((left+1)==right)//分治的数组只有两个值时,更新max和min的值
voidShowArray(int*array)//输出数组
inti;
for(i=0;
N;
i++)
printf("
%d"
array[i]);
voidCreateArray(int*array)//创建随机数数组
srand((unsigned)time(NULL));
//给随机函数设置种子
array[i]=rand()%100+1;
//产生1~100内的随机数
2、众数问题
iostream>
fstream>
usingnamespacestd;
classNumbers//存储数组中数字出现的次数
public:
Numbers()
count=0;
//初始化每个数字出现的次数
intvalue;
intcount;
};
intReadLen(char*);
voidReadArray(char*,int*,int);
voidShow(int*,int);
voidquickSort(int*,int,int);
voidMode(int*,int,Numbers*);
voidWriteFile(char*,int,Numbers*);
intsize=0;
//记录数组的长度
char*inFile="
e:
\\input.txt"
;
//input文件的绝对路径
char*outFile="
\\output.txt"
//output文件的绝对路径
size=ReadLen(inFile);
int*array=newint[size];
//创建数组
ReadArray(inFile,array,size);
quickSort(array,0,size-1);
//对数组用快速排序法按从小到大排序
cout<
<
"
排序好的数组为:
"
<
endl;
Show(array,size);
Numbers*numbers=newNumbers[size];
Mode(array,size,numbers);
WriteFile(outFile,size,numbers);
voidWriteFile(char*filename,intsize,Numbers*numbers)//将结果写入文件
intmaxCount=0;
for(inti=1;
size;
i++)//找出数组中出现次数最多的数值最小的数
if(numbers[i].count>
numbers[maxCount].count)
maxCount=i-1;
if(maxCount==0)
cout<
该数组中不存在众数!
endl;
ofstreamoutput;
output.open(filename,ios:
:
out);
output<
numbers[maxCount].value<
numbers[maxCount].count<
for(intj=0;
j<
j++)//找出数组中出现次数同样多的其他数(可能不存在)
if(numbers[maxCount].count==numbers[j].count&
maxCount!
=j)
output<
numbers[j].value<
numbers[j].count<
output.close();
查找成功,请查看output文件。
voidMode(int*array,intsize,Numbers*numbers)//找出数组中的众数和其重数
intcount=1;
//初始化某个数出现的次数
for(inti=0;
size-1;
i++)//遍历排好序的数组,计算出每个数出现的次数
if(array[i]==array[i+1])
count++;
else
numbers[i].value=array[i];
//将重数标记在同数的最后一个
numbers[i].count=count;
count=1;
numbers[size-1].value=array[size-1];
numbers[size-1].count=count;
voidquickSort(int*array,intleft,intright)//用快速排序法排序数组
//以第一个数为基准
voidShow(int*array,intsize)//显示数组的结果
array[i]<
'
\t'
cout<
voidReadArray(char*fileName,int*array,intsize)//从文件中读取数组的内容
inttemp;
ifstreaminput(fileName,ios:
in);
input>
>
temp;
//将第一个表示长度的读取,放弃
input>
array[i];
input.close();
intReadLen(char*fileName)//读取数组长度
intsize;
ifstreaminput(fileName,ios:
returnsize;