22

同时找出最大值和最小值的一种优化算法-MaxAndMin

在一个有n个元素的集合中,单独求出最大值(或最小值)的算法,很容易实现,只需按序扫描整个序列,记录最大值(或最小值),其上限为n-1次。

但在很多应用中,需同时找到最大值和最小值,一般情况大家较容易想到用上面的算法独立的找到最大值和最小值,各用n-1次,共有2n-2次比较。这在大容量数据库中(n很大),效率不是很高。

在这里,我将给出一种新的算法代码,以大幅提高其效率(n很大时)。具体做法是:每次成对的处理数据,先将一对元素进行比较,然后把较大者与当前最大值比较,较小者与当前最小者比较,因此每两个元素需要3次比较。具体实现时需考虑n的奇偶,n为奇数,3【n/2】次;n为偶数,3n/2-2次。因此总的比较次数至多为3【n-2】。(注:【n】表示不大于n的整数)。



具体C++源代码如下:
22#include<iostream.h>

22#include
<limits.h>//包含INT_MAX,INT_MIN的头文件

22


22
intnMax=INT_MIN;//将INT_MIN设为当前最大值的初始值

22
intnMin=INT_MAX;

2222
/////记录比较最大值函数

22intMax(intnNum)

2222
{

22
if(nMax<nNum)

2222
{

22 nMax
=nNum;

22 }


22
returnnMax;

22}


2222
//////记录比较最小值函数

22intMin(intnNum)

2222
{

22
if(nMin>nNum)

2222
{

22 nMin
=nNum;

22 }


22
returnnMin;

22}


22
voidmain()

2222
{

22
//测试序列

2222
intnData[]={3,2,5,9,4,2,1,13,0,-1,1380};

22
intnLen=sizeof(nData)/sizeof(nData[0]);

22

22
if(nLen%2==1)//待测数据为奇数

2222
{

22
//待测数据为奇数,最值初始值均设为nData[0]

22
Max(nData[0]);

22 Min(nData[
0]);

22

22
for(inti=1;i<=(nLen-1)/2;i++)

2222
{

22
if(nData[i]>nData[nLen-i])

2222
{

22 Max(nData[i]);

22 Min(nData[nLen
-i]);

22 }


22
else

2222
{

22 Max(nData[nLen
-i]);

22 Min(nData[i]);

22 }


22 }


22 }


22
else//待测序列为偶数

2222
{

22
for(inti=0;i<nLen/2;i++)

2222
{

22
if(nData[i]>nData[nLen-i-1])

2222
{

22 Max(nData[i]);

22 Min(nData[nLen
-i-1]);

22 }


22
else

2222
{

22 Max(nData[nLen
-i-1]);

22 Min(nData[i]);

22 }


22 }


22 }


22

22 cout
<<"nMax ="<<nMax<<endl<<"nMin ="<<nMin<<endl;

22}
原文链接: https://www.cnblogs.com/huawei198707/archive/2012/05/18/2508263.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/50549

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午2:11
下一篇 2023年2月9日 上午2:13

相关推荐