博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程之美4:求数组中的最大值和最小值
阅读量:6072 次
发布时间:2019-06-20

本文共 3522 字,大约阅读时间需要 11 分钟。

方法1:暴力方法 遍历一遍数组,比较2*N次求出最大值和最小值

方法2:改进方法 (破坏了原数组

            遍历一遍数组使得下标为偶数的元素较下标为奇数的元素大,再分别求出最大值和最小值
            比较次数为3*N/2次

方法3:改进方法 (不破坏原数组

             遍历一遍数组将相邻元素中较大值和nMax比较,将较小值和nMin比较
             比较次数为3*N/2次

方法4:改进方法

            分治思想,先分别求出前半部分和后半部分数组的最大值和最小值,
            然后两部分中的最大值和最小值分别比较求出整个数组的最大值和最小值
            比较次数为3*N/2-2次

代码如下:

// 求数组中的最大值最小值.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include 
using namespace std;//方法一:暴力方法 遍历一遍数组,比较2*N次求出最大值和最小值void FindMaxAndMinMethod1(int *pArr, int nLength, int &nMax, int &nMin){ if (pArr == NULL || nLength <= 0) { cout << "输入有误!" << endl; return; } nMax = pArr[0]; nMin = pArr[0]; for (int i=1; i
pArr[i]) { nMin = pArr[i]; } if (nMax < pArr[i]) { nMax = pArr[i]; } }}//方法二:改进方法 (破坏了原数组)//遍历一遍数组使得下标为偶数的元素较下标为奇数的元素大,再分别求出最大值和最小值//比较次数为3*N/2次void FindMaxAndMinMethod2(int *pArr, int nLength, int &nMax, int &nMin){ if (pArr != NULL && nLength > 0) { if (nLength == 1)//数组只有一个元素 { nMax = pArr[0]; nMin = pArr[0]; return; } if (nLength == 2)//数组只有两个元素 { if (pArr[0] > pArr[1]) { nMax = pArr[0]; nMin = pArr[1]; } else { nMax = pArr[1]; nMin = pArr[0]; } return; } //遍历一遍数组使得下标为偶数的元素较下标为奇数的元素大 for (int i=0; i
pArr[t]) { nMin = pArr[t]; } } } }//方法三:改进方法 (不破坏原数组)//遍历一遍数组将相邻元素中较大值和nMax比较,将较小值和nMin比较//比较次数为3*N/2次void FindMaxAndMinMethod3(int *pArr, int nLength, int &nMax, int &nMin){ if (pArr != NULL && nLength > 0) { if (nLength == 1)//数组只有一个元素 { nMax = pArr[0]; nMin = pArr[0]; return; } if (nLength == 2)//数组只有两个元素 { if (pArr[0] > pArr[1]) { nMax = pArr[0]; nMin = pArr[1]; } else { nMax = pArr[1]; nMin = pArr[0]; } return; } //初始赋值 if (pArr[0] > pArr[1]) { nMax = pArr[0]; nMin = pArr[1]; } else { nMax = pArr[1]; nMin = pArr[0]; } for (int i=2; i
pArr[i])//将较小值和nMin比较 { nMin = pArr[i]; } } else if (i+1 < nLength && pArr[i] > pArr[i+1]) { if (nMax < pArr[i])//将较大值和nMax比较 { nMax = pArr[i]; } if (nMin > pArr[i+1])//将较小值和nMin比较 { nMin = pArr[i+1]; } } else//最后剩下一个元素 { if (nMax < pArr[i]) { nMax = pArr[i]; } if (nMin > pArr[i]) { nMin = pArr[i]; } } } } }//方法四:改进方法 //分治思想,先分别求出前半部分和后半部分数组的最大值和最小值,//然后两部分中的最大值和最小值分别比较求出整个数组的最大值和最小值//比较次数为3*N/2-2次void FindMaxAndMinMethod4(int *pArr, int nStart, int nEnd, int &nMax, int &nMin){ if (nEnd - nStart <= 1) { if (pArr[nStart] > pArr[nEnd]) { nMax = pArr[nStart]; nMin = pArr[nEnd]; } else { nMax = pArr[nEnd]; nMin = pArr[nStart]; } return; } int nLeftMax = 0; int nLeftMin = 0; int nRightMax = 0; int nRightMin = 0; FindMaxAndMinMethod4(pArr, nStart, nStart+(nEnd-nStart)/2, nLeftMax, nLeftMin); FindMaxAndMinMethod4(pArr, nStart+(nEnd-nStart)/2+1, nEnd, nRightMax, nRightMin); nMax = nLeftMax > nRightMax ? nLeftMax : nRightMax; nMin = nLeftMin < nRightMin ? nLeftMin : nRightMin; }int _tmain(int argc, _TCHAR* argv[]){ //int nArr[1] = {-4}; //int nArr[2] = {-4,-1}; //int nArr[3] = {-4,-1,0}; int nArr[5] = {-4,-1,0, 8,9}; int max = 0; int min = 0; FindMaxAndMinMethod1(nArr, 5, max, min); cout << "最大值为:" << max << " 最小值为:" << min << endl; max = 0; min = 0; FindMaxAndMinMethod2(nArr, 5, max, min); cout << "最大值为:" << max << " 最小值为:" << min << endl; max = 0; min = 0; FindMaxAndMinMethod3(nArr, 5, max, min); cout << "最大值为:" << max << " 最小值为:" << min << endl; max = 0; min = 0; FindMaxAndMinMethod4(nArr, 0, 4, max, min); cout << "最大值为:" << max << " 最小值为:" << min << endl; system("pause"); return 0;}

运行结果:

 

你可能感兴趣的文章
FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择
查看>>
steam账号分享工具、迅游账号分享工具说明:
查看>>
c++中冒号(:)和双冒号(::)的用法
查看>>
ServletContext保存访问量
查看>>
IMSI,TMSI的关系
查看>>
JPA + Hibernate + PostgreSQL + Maven基本配置示例
查看>>
vue cordova生成app
查看>>
Kubernetes安装部署演示介绍
查看>>
koa中间件
查看>>
form表单的默认提交行为
查看>>
BZOJ 4128 Matrix ——BSGS
查看>>
Math(初学)
查看>>
读书笔记之:鸟哥的Linux私房菜——基础学习篇(第三版) (13-17章)
查看>>
三位对我影响最大的老师
查看>>
一个gulp用于开发与生产的示例
查看>>
2015区域赛起航
查看>>
服务器电脑名称改后,需要修改那些内容。
查看>>
第186天:js深入理解构造函数和原型对象
查看>>
页面自动刷新
查看>>
职业规划
查看>>