在20級新生刷題組中我遇到了用分治法求最大值與最小值的演算法題,初看一臉懵,深入 初步的了解中突然發現跟二分法(一次劃分)有著驚人的相似,好吧qaq,其實二分法就是屬於分治法的一種。
首先,分治法顧名思義,即為分而治之,把乙個整理的多個資料,分成多塊的少個資料來處理。
我們來演示:
輸入五個數:9 5 7 3 10
根據首位數下標加上末尾數的下標除以2找到這組分組的中點mid,用i來表示每個分組的第一位下標,j表示每組最後乙個數的下標。
i =0 mid =2 j=4
接下來就是分組啦~ 分別在9 5 7 和 7 3 10 這兩組中找到最大值和最小值 。同理再分別找到中點mid,然後再進行分組找最大和最小數為:9 5 和5 7。當每組只有兩個數的時候就可以進行比較啦,如果是找最大,就返回較大的值,如果是找最小,就返回較小的值 ,這時就能完成每兩個數為一組的最值了,然後返回的那個最值返回到每三個數為一組 的那個函式也就是 9 5 7 這組數,當找最大值時返回的兩個 數分別為9和7.然後再從這兩個數中找到最值返回,(找最大值)返回即是9,這時候前三個的最值已經找到了,也就是一分為二的其中一組最值找到了,現在就剩下後面那組了,同理可得,7 3 10 (①7 3 ➡7,②3 10➡10,③7 10➡10)三次分組最終返回的最值也就是10 。在這裡我們就得到了將整個陣列中的所有數分成兩組分別返回的兩個最值為9和10,最後就剩下比較這兩個值就能得到整個陣列的最值啦。9 10➡ 10.所以整個陣列的最大值為10。這就是分治法了呢,將資料的乙個個分成塊(分而治之)看到這你們是不是也與我一樣有種跟二分法同根本源的感覺呢。
接下來就是源**啦
int max(int a,int i,int j)// 從主函式傳來頭和尾的位址 i, j
}
int min(int a,int i,int j)//找最小值同理找最大值
{
int mid,num1,num2;
mid=(i+j)/2;
if(i==j)
return a[i];
else if(i+1==j)
return a[i]
else
{num1= min(a,i,mid);
num2=min(a,mid,j);
return num1
最大值 最小值
求最大最小的時候有點小技巧,就是我們兩個兩個的比較,把大個跟當前最大比較,小的跟當前最小的比較,這樣就會節約一點比較時間,有原來的2 n到3 n 2。include include 得到最大最小值 int getmaxmin int ndata,int nlen,int pnmax,int pnmi...
用分治法尋找陣列中的最大值與最小值
整體思路 將陣列劃分成兩半,分別找出兩邊的最小值與最大值,兩邊區域性最小值中較小的那個為整體最小值,兩邊區域性最大值中較大的為整體的最大值 由於是遞迴實現需要考慮終止條件 當區間容量為2或1時,獲取區域性最小值與最大值 void getmaxmin vector a,int left,int rig...
int float double 最大值,最小值
中沒有double的最大最小值。如果輸出的比如 100lf輸出2.23432432,沒有達到100位,則最後2後面不一定都是0。原文見view plaincopy to clipboardprint?coder acboy date 2010 3 1 include include using na...