分治法實現尋找陣列最大最小值

2021-10-04 21:42:43 字數 933 閱讀 7690

我們拿到乙個長度為k的一維陣列,想要在短時間內進行最大最小值的查詢,第一種想法就是現將陣列進行排序,這樣首末的元素分別是最小和最大的元素。排序演算法中,快速排序、歸併排序、堆排序等排序演算法的時間複雜度都是o(nlogn),第二種想法就是建立堆,但是需要分別建立最小值堆和最大值堆,我們可以採取第三種做法,將整個陣列進行一次次的二分,直到二分後的結果只有兩個元素,比較取出最小值或者最大值,採用這種分治的方法可以快速有效的尋找到最大值和最小值,時間複雜度為o(logn)

下面是c++的具體實現:

#include

using

namespace std;

intleast

(int

* array,

int start,

int ends)

else

if(ends - start ==1)

else

//else}}

intmost

(int

* array,

int start,

int ends)

else

if(ends - start ==1)

else

//else}}

intmain()

int max =

most

(array,

0,length-1)

;int min =

least

(array,

0,length-1)

; cout <<

"the max is "

<< max <<

"\n"

; cout <<

"the min is "

<< min <<

"\n"

;return0;

}

分治法查詢陣列最大最小值

大致說明下程式流程,呼叫find函式後,將判斷是否為最小子結構,如果不是則將它2分繼續判斷,如果是最小子結構,則把最小子結構的元素與全域性最大最小值做比較.這裡假設資料元素個數為8時,該程式走的流程應該是 0 7分解為0 3 0 3分解為0 1滿足最小子結構做完比較後return 繼續0 3分解的2...

分治法求陣列最大最小值

常規的做法是遍歷一次,分別求出最大值和最小值,但我這裡要說的是分治法 divide and couquer 將陣列分成左右兩部分,先求出左半部份的最大值和最小值,再求出右半部份的最大值和最小值,然後綜合起來求總體的最大值及最小值。這是個遞迴過程,對於劃分後的左右兩部分,同樣重複這個過程,直到劃分區間...

用分治法尋找陣列中的最大值與最小值

整體思路 將陣列劃分成兩半,分別找出兩邊的最小值與最大值,兩邊區域性最小值中較小的那個為整體最小值,兩邊區域性最大值中較大的為整體的最大值 由於是遞迴實現需要考慮終止條件 當區間容量為2或1時,獲取區域性最小值與最大值 void getmaxmin vector a,int left,int rig...