遞迴求陣列最大最小值(分治思想)
阿新 • • 發佈:2019-02-02
求陣列最大最小值我們可以用遍歷或者最簡單的排序方法來實現,但是那樣子的時間複雜度將會大很多,因此我們可以採用分治思想來求最大最小值,即先求左右兩部分,即先求出左半部分的最大最小值,再求出右半部分的最大最小值,然後再把左右兩部分的最大最小值合起來求總的最大最小值。
程式碼如下:
#include<iostream> using namespace std; /* author:chhuaj date:2013.9.13 description:求陣列的最大和最小值(採用遞迴法) */ void max_min(int *num,int l,int r,int &maxnum,int &minnum) { if(l==r) //陣列只有一個元素 { maxnum=num[l]; minnum=num[l]; return; } if(l+1==r) //陣列有兩個元素 { if(num[l]>num[r]) { maxnum=num[l]; minnum=num[r]; } else { maxnum=num[r]; minnum=num[l]; } return; //確定最大最小值之後必須返回,否則將進入死迴圈。 } int m =(l+r)/2; int lmax,lmin; max_min(num,l,m,lmax,lmin); //遞迴求左半部分最大最小值 int rmax,rmin; max_min(num,m,r,rmax,rmin); //遞迴求右半部分最大最小值 maxnum = max(lmax,rmax); minnum = min(lmin,rmin); //總的最大最小值 } int main() { int a[10]={0,9,1,6,3,4,8,2,7,5}; int maxnum,minnum; max_min(a,0,9,maxnum,minnum); cout<<maxnum<<","<<minnum<<endl; return 0; }