1、 采用同样的处理方法递归处理以分好的数据集。2.1.2 细节处理: 数组的大小为,n=0,1,2,3. 数组中的数字随机产生,数字的范围为1100; 静态全局变量:max的初值为0,min的初值为101。2.2 众数问题2.2.1 快速排序算法: 设置两个变量i、j,排序开始的时候:i=left,j=right+1; 以第一个数组元素作为关键数据,赋值给temp,即temp=arrayleft; 从j开始向前搜索,即由后开始向前搜索(-j),找到第一个小于temp的值arrayj; 从i开始向后搜索,即由前开始向后搜索(+i),找到第一个大于temp的arrayi; 交换arrayi和arra
2、yj的值; 重复搜索步骤,直到i=j; 将temp的值和arrayj的值交换,并以此为界,分别在对左右两边进行快速排序。3. 核心代码3.1 查找最值3.1.1 流程图(如图1)(核心函数为void MaxAndMin(int arrayN, int left, int right): 图1.查找最值的流程图3.1.2 核心代码如下:(注:max和min是静态全局变量)void MaxAndMin(int arrayN, int left, int right) / 求最大值最小值函数,分治递归法 int mid; / 数组的分界点 if ( (left + 1) = right) / 分治的
3、数组只有两个值时,更新max和min的值 if ( arrayleft arrayright & max arrayleft ) max = arrayleft; min arrayleft) / 判断、更新最小值 min = arrayleft; arrayright) min = arrayright; else mid = (left + right) / 2; / 对数组进行分治 MaxAndMin(array, left, mid); / 对左边的数组进行分治递归 MaxAndMin(array, mid + 1, right); / 对右边的数组进行分治递归3.2 众数问题3.2.
4、1 流程图(如图2) 图2.众数问题的流程图3.2.2 核心代码如下:void quickSort(int *array,int left,int right) / 用快速排序法排序数组 if(left right) int i = left, j = right+1; int temp = arrayleft; / 以第一个数为基准 while(true) while(array+i temp & i temp); / 从后面找小于基准的数 if(i = j) / 当leftright时停止 break; swap(arrayi, arrayj); / 交换两值 arrayleft = ar
5、rayj; arrayj = temp; int part = 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 有两个众
6、数(如图10、图11)图10.有两个众数的数组 图11.有两个众数的结果5. 结果分析和小结5.1 结果分析:通过设置不同的测试数据及运行的结果,可以看出程序的算法思想是正确的,程序的运行也是有效的,全面的。5.2 实验的收获、心得体会:通过对于这两个题目的分析和设计,我正确的掌握了分治算法的思想,以及使用分治算法来解决不同的问题,对程序的设计思想有了更好、更深的练习。附录(C/C+源代码)1、查找数组最大、最小值/程序默认数组的大小值为2的幂,随机数的范围是1100#include stdlib.htime.h#define N 8 / 数组的大小static int max=0; / 存储
7、最大值static int min=101; / 存储最小值void CreateArray(int *);void ShowArray(int *);void MaxAndMin(int *, int, int);void main() int arrayN; CreateArray(array); printf(产生的随机数组为:n); ShowArray(array); MaxAndMin(array, 0, 7);该数组的最大值为:%d,最小值为:%dn,max,min);void MaxAndMin(int arrayN, int left, int right) / 求最大值最小值
8、函数,分治递归法 if ( (left + 1) = right) / 分治的数组只有两个值时,更新max和min的值void ShowArray(int *array) / 输出数组 int i; for (i = 0; N; i+) printf(%d ,arrayi);void CreateArray(int *array) / 创建随机数数组 srand( (unsigned) time( NULL ) ); / 给随机函数设置种子 arrayi = rand() % 100 + 1; /产生1100内的随机数2、众数问题iostreamfstreamusing namespace s
9、td;class Numbers /存储数组中数字出现的次数 public: Numbers() count = 0; / 初始化每个数字出现的次数 int value; int count;int ReadLen(char *);void ReadArray(char *, int *, int);void Show(int *, int);void quickSort(int *, int, int);void Mode(int *, int, Numbers *);void WriteFile(char *, int, Numbers *); int size = 0; / 记录数组的长
10、度 char *inFile = e:input.txt; / input文件的绝对路径 char *outFile = output.txt / output文件的绝对路径 size=ReadLen(inFile); int *array = new intsize; / 创建数组 ReadArray(inFile, array, size); quickSort(array, 0, size-1); /对数组用快速排序法按从小到大排序 cout 排序好的数组为: numbersmaxCount.count) maxCount = i - 1; if (maxCount = 0) cout
11、该数组中不存在众数!endl; ofstream output; output.open(filename, ios:out); output numbersmaxCount.value numbersmaxCount.count for(int j = 0; j j+) / 找出数组中出现次数同样多的其他数(可能不存在) if(numbersmaxCount.count = numbersj.count & maxCount != j) output numbersj.value numbersj.count output.close();查找成功,请查看output文件。void Mode
12、(int*array, int size, Numbers *numbers) / 找出数组中的众数和其重数 int count = 1; /初始化某个数出现的次数 for(int i = 0; size - 1; i+) /遍历排好序的数组,计算出每个数出现的次数 if(arrayi = arrayi + 1) count+; else numbersi.value = arrayi; / 将重数标记在同数的最后一个 numbersi.count = count; count = 1; numberssize-1.value = arraysize-1; numberssize-1.count = count;void quickSort(int *array,int left,int right) / 用快速排序法排序数组 / 以第一个数为基准void Show(int *array,int size) / 显示数组的结果 arrayit cout temp; / 将第一个表示长度的读取,放弃 input arrayi; input.close();int ReadLen(char *fileName) / 读取数组长度 int size; ifstream input(fileName, ios: return size;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1