遞迴求最大最小值演算法 分治策略(c語言實現)
阿新 • • 發佈:2019-01-28
思路:運用分治的思想,將要排序的整個陣列從中間劈開,分別求其左右兩邊的最大最小值,然後將求出的最大最小值合起來進行比較。
當左右兩邊的陣列小到一定程度時:
(1)陣列中只有一個元素,maxNum=minNum;
(2)陣列中有兩個元素,找出兩個元素中的最大最小值;
(3)陣列中大於兩個元素,從中間分開,繼續遞迴;
執行截圖:#include<stdio.h> #include<iostream> #include<stdlib.h> using namespace std; int arr[10]; void getMax_Min(int left,int right,int &maxNum,int &minNum){ if(left==right){ maxNum=arr[left]; minNum=arr[left]; return ; }else if(left+1==right){ maxNum=arr[left]>arr[right]?arr[left]:arr[right]; minNum=arr[left]>arr[right]?arr[right]:arr[left]; return ; }else{ int mid=(left+right)/2; int leftMax,leftMin,rightMax,rightMin; getMax_Min(left,mid,leftMax,leftMin);//遞迴找出左邊的最大最小值 getMax_Min(mid,right,rightMax,rightMin);//遞迴找出右邊的最大最小值 maxNum=max(leftMax,rightMax);//左右兩邊最大值相比較,取最大的 minNum=min(leftMin,rightMin);//左右兩邊最小值相比較,取最小的 } } int main(){ for(int i=0;i<10;i++){ arr[i]=rand();//生成隨機數 cout<<arr[i]<<" "; } cout<<endl; int maxNum,minNum; getMax_Min(0,9,maxNum,minNum); cout<<"最大值是:"<<maxNum<<" 最小值是:"<<minNum<<endl; return 0; }