zoukankan      html  css  js  c++  java
  • 编程之美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;
    }
    

    运行结果:


  • 相关阅读:
    20191112 Spring Boot官方文档学习(4.5-4.6)
    20191112 Spring Boot官方文档学习(4.4)
    (转)service apache2 restart失败
    (mark)ubuntu16.04下安装&配置anaconda+tensorflow新手教程
    解决ssh连接中断程序终止的问题——tmux
    Tensorflow取消占用全部GPU
    Linux大文件split分割以及cat合并
    常用压缩/解压操作
    HM16.0帧内预测重要函数笔记
    GIT LFS 使用笔记
  • 原文地址:https://www.cnblogs.com/james1207/p/3358227.html
Copyright © 2011-2022 走看看