我們拿到乙個長度為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...