查找数组元素的最大值和最小值众数问题Word格式.docx

上传人:b****5 文档编号:16864100 上传时间:2022-11-26 格式:DOCX 页数:13 大小:232.13KB
下载 相关 举报
查找数组元素的最大值和最小值众数问题Word格式.docx_第1页
第1页 / 共13页
查找数组元素的最大值和最小值众数问题Word格式.docx_第2页
第2页 / 共13页
查找数组元素的最大值和最小值众数问题Word格式.docx_第3页
第3页 / 共13页
查找数组元素的最大值和最小值众数问题Word格式.docx_第4页
第4页 / 共13页
查找数组元素的最大值和最小值众数问题Word格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

查找数组元素的最大值和最小值众数问题Word格式.docx

《查找数组元素的最大值和最小值众数问题Word格式.docx》由会员分享,可在线阅读,更多相关《查找数组元素的最大值和最小值众数问题Word格式.docx(13页珍藏版)》请在冰豆网上搜索。

查找数组元素的最大值和最小值众数问题Word格式.docx

●采用同样的处理方法递归处理以分好的数据集。

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1