编程之美4:求数组中的最大值和最小值

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

方法2:改进方法 (破坏了原数组
            遍历一遍数组使得下标为偶数的元素较下标为奇数的元素大,再分别求出最大值和最小值
            比较次数为3*N/2次

方法3:改进方法 (不破坏原数组
             遍历一遍数组将相邻元素中较大值和nMax比较,将较小值和nMin比较
             比较次数为3*N/2次

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

代码如下:

// 求数组中的最大值最小值.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
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<nLength; i++)
	{
		if (nMin > 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<nLength; i+=2)
		{
			if (i+1 < nLength && pArr[i] < pArr[i+1])
			{
				int nTemp = pArr[i];
				pArr[i] = pArr[i+1];
				pArr[i+1] = nTemp;
			}
		}

		//求最大值
		nMax = pArr[0];
		for (int j=2; j<nLength; j+=2)
		{
			if (nMax < pArr[j])
			{
				nMax = pArr[j];
			}
		}

		//求最小值
		nMin = pArr[1];
		for (int t=3; t<nLength; t+=2)
		{
			if (nMin > 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<nLength; i+=2)
		{
			if (i+1 < nLength && pArr[i] < pArr[i+1])
			{
				if (nMax < pArr[i+1])//将较大值和nMax比较
				{
					nMax = pArr[i+1];
				}

				if (nMin > 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;
}

运行结果:


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值