查找数组元素的最大值和最小值众数问题.docx
- 文档编号:3957168
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:13
- 大小:232.13KB
查找数组元素的最大值和最小值众数问题.docx
《查找数组元素的最大值和最小值众数问题.docx》由会员分享,可在线阅读,更多相关《查找数组元素的最大值和最小值众数问题.docx(13页珍藏版)》请在冰豆网上搜索。
查找数组元素的最大值和最小值众数问题
《算法设计与分析》
上机实验报告
专业
班级
学号
学生姓名
完成日期
1.上机题目及实验环境
1.1上机题目:
1.1.1用分治法查找数组元素的最大值和最小值
1.1.2众数问题
1.2实验环境:
CPU:
IntelCorei32.30GHz
内存:
2.0G
操作系统:
Windows7
软件平台:
VisualC++
2.算法设计与分析
2.1查找数组最值
2.1.1分治递归方法:
●将max和min设置为静态全局变量;
●将数据集array平均分为两个数据集;
●分别求解两个数据集中的最大和最小值;
●最终的最大和最小值通过与max和min的值比较;
●采用同样的处理方法递归处理以分好的数据集。
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] max=array[right]; if(array[left]>array[right]&&max max=array[left]; if(array[left] min=array[left]; if(array[left]>array[right]&&min>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.众数问题的流程图 图2.众数问题的流程图 3.2.2核心代码如下: voidquickSort(int*array,intleft,intright)//用快速排序法排序数组 { if(left { inti=left,j=right+1; inttemp=array[left];//以第一个数为基准 while(true) { while(array[++i] 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 #include #include #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); printf("该数组的最大值为: %d,最小值为: %d\n",max,min); } voidMaxAndMin(intarray[N],intleft,intright)//求最大值最小值函数,分治递归法 { intmid; if((left+1)==right)//分治的数组只有两个值时,更新max和min的值 { if(array[left] max=array[right]; if(array[left]>array[right]&&max max=array[left]; if(array[left] min=array[left]; if(array[left]>array[right]&&min>array[right]) min=array[right]; } else { mid=(left+right)/2;//对数组进行分治 MaxAndMin(array,left,mid);//对左边的数组进行分治递归 MaxAndMin(array,mid+1,right);//对右边的数组进行分治递归 } } voidShowArray(int*array)//输出数组 { inti; for(i=0;i printf("%d",array[i]); printf("\n"); } voidCreateArray(int*array)//创建随机数数组 { inti; srand((unsigned)time(NULL));//给随机函数设置种子 for(i=0;i array[i]=rand()%100+1;//产生1~100内的随机数 } 2、众数问题 #include #include 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*); voidmain() { intsize=0;//记录数组的长度 char*inFile="e: \\input.txt";//input文件的绝对路径 char*outFile="e: \\output.txt";//output文件的绝对路径 size=ReadLen(inFile); int*array=newint[size];//创建数组 ReadArray(inFile,array,size); quickSort(array,0,size-1);//对数组用快速排序法按从小到大排序 cout<<"排序好的数组为: "< 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;i if(numbers[i].count>numbers[maxCount].count) maxCount=i-1; if(maxCount==0) cout<<"该数组中不存在众数! "< else { ofstreamoutput; output.open(filename,ios: : out); output< for(intj=0;j if(numbers[maxCount].count==numbers[j].count&&maxCount! =j) output< output.close(); cout<<"查找成功,请查看output文件。 "< } } voidMode(int*array,intsize,Numbers*numbers)//找出数组中的众数和其重数 { intcount=1;//初始化某个数出现的次数 for(inti=0;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)//用快速排序法排序数组 { if(left { inti=left,j=right+1; inttemp=array[left];//以第一个数为基准 while(true) { while(array[++i] 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); } } voidShow(int*array,intsize)//显示数组的结果 { for(inti=0;i cout< cout< } voidReadArray(char*fileName,int*array,intsize)//从文件中读取数组的内容 { inttemp; ifstreaminput(fileName,ios: : in); input>>temp;//将第一个表示长度的读取,放弃 for(inti=0;i input>>array[i]; input.close(); } intReadLen(char*fileName)//读取数组长度 { intsize; ifstreaminput(fileName,ios: : in); input>>size; returnsize; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 查找 数组 元素 最大值 最小值 众数 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)