[BUC-2.10]利用分治的思想求无序数组中的最大值和最小值以及求第二大的值(分治的思想可以使得比较的次数1.5N-2)

      利用分治的思想求无序数组中的最大值和最小值以及求第二大的值(分治的思想可以使得比较的次数1.5N-2),相比较而言顺序遍历的方式在比较次数上较分治思想要比较更多的次数。

      在利用分治思想的时候要考虑的情况挺多的,尤其是求第二大的数的时候,一定要考虑问题要全面。

 

/******************************************************************* * * DESCRIPTION: For Divisor Rule Method [分治方式] * 解决 求最大最小值的问题,以及求第二大(或者也包括第一大) * 数据用分治解决以上问题,可以使得比较的次数交,顺序线性 * 比较的方式较少...... * * AUTHOR: Neesky * * DATE:2009-11-2 * *******************************************************************/ /**Macro Definition*/ #define MINIMIZE 0x80000000 #define MAXIMIZE 0X7FFFFFFF /** include files **/ #include <iostream> using namespace std; int Array[9]={9,9,9,9,8,9,9,9,9}; /** * Get the Max and Min in Array * Divide And Rule Alogrithm * Compare time is 1.5N-2 is the best * * @author NeeSky (2009-11-2) * * @param Arr * @param N */ pair<int,int> GetMaxAndMin(int Arr[], int headIndex,int tailIndex) { if(headIndex==tailIndex) return make_pair<int,int>(Array[headIndex],Array[headIndex]); pair<int,int> LeftMaxAndMin,RightMaxAndMin; int mid=(headIndex+tailIndex)/2; LeftMaxAndMin =GetMaxAndMin(Arr,headIndex,mid); RightMaxAndMin =GetMaxAndMin(Arr,mid+1,tailIndex); int Max=LeftMaxAndMin.first>RightMaxAndMin.first?LeftMaxAndMin.first:RightMaxAndMin.first; int Min=LeftMaxAndMin.second>RightMaxAndMin.second?RightMaxAndMin.second:LeftMaxAndMin.second; return make_pair<int,int>(Max,Min); } void GetMaxAndMinFunction(int Arr[],int N) { pair<int,int> MaxAndMin=GetMaxAndMin(Arr,0,N-1); cout<<"/nMax is : "<<MaxAndMin.first<<endl; cout<<"Min is : "<<MaxAndMin.second<<endl; return; } /** * Get the second Max Number, It Seems easy ,but the situation * must be considered carefully. * For example: (M1,W1)AND(M1,W2) so ,Has same max,and compare * W1 AND W2 ,which is the second max, and if second is MINIMIZE * ,so there is no second max number,for the all number is same. * Compare Time is 1.5N-2 ,it is very good. * * @author NeeSky (2009-11-2) * * @param Arr * @param N * * @return int */ pair<int,int> GetMaxSecMaxInArray(int Arr[],int head,int tail) { if(head==tail||(head+1==tail&&Arr[head]==Arr[tail]))/*JUST ONLY HAS MAXSIZE NUMBER*/ return make_pair<int,int>(Arr[head],MINIMIZE); if(head+1==tail&&Arr[head]>Arr[tail])return make_pair<int,int>(Arr[head],Arr[tail]); if(head+1==tail&&Arr[head]<Arr[tail])return make_pair<int,int>(Arr[tail],Arr[head]); int mid=(head+tail)/2; pair<int,int> leftMaxSecMax =GetMaxSecMaxInArray(Arr,head,mid); pair<int,int> rightMaxSecMax=GetMaxSecMaxInArray(Arr,mid+1,tail); int Max=leftMaxSecMax.first>rightMaxSecMax.first?leftMaxSecMax.first:rightMaxSecMax.first; int SecMax; if(leftMaxSecMax.first==rightMaxSecMax.first) SecMax=leftMaxSecMax.second>rightMaxSecMax.second?leftMaxSecMax.second:rightMaxSecMax.second; else if(leftMaxSecMax.first>rightMaxSecMax.first) SecMax=rightMaxSecMax.first>leftMaxSecMax.second?rightMaxSecMax.first:leftMaxSecMax.second; else SecMax=rightMaxSecMax.second>leftMaxSecMax.first?rightMaxSecMax.second:leftMaxSecMax.first; return make_pair<int,int>(Max,SecMax); } void GetSecondMax(int Arr[],int N) { pair<int,int> MaxSecMax=GetMaxSecMaxInArray(Arr,0,N-1); cout<<"/nSecond Max : "; if(MaxSecMax.second==MINIMIZE) cout<<" Sorry, Not Exist Second Max......"; else cout<<MaxSecMax.second<<endl; return; } /** * The Main Programming * * @author NeeSky (2009-11-2) * * @param argc * @param argv * * @return int */ int main (int argc, char *argv[]) { GetMaxAndMinFunction(Array,9); GetSecondMax(Array,9); return(0); }

 

输出:

Debug/BeautifulCoding20091102.exe 

Max is : 9
Min is : 8

Second Max : 8

 

 

 

你可能感兴趣的:(Date,include)