參考:《資料結構》鄧俊輝
求陣列a 在區間 [lo, hi) 內的最大值和第二大值。
返回最大值的下標x1和第二大值的下標x2
迭代1:
void
max2
(int a,
int lo,
int hi,
int&x1,
int&x2)
迭代2:(相對於迭代1不會改進最壞情況下的時間複雜度)
void
swap
(int
&x,int
&y)void
max2
(int a,
int lo,
int hi,
int&x1,
int&x2)
遞迴:(分治法)
(把陣列分為左右兩個陣列,分別求左右兩個陣列的最大值和次大值,然後再從結果中求最大值和次大值)
void
swap
(int
&x,int
&y)void
max2
(int a,
int lo,
int hi,
int&x1,
int&x2)
if(lo +
3== hi)
//區間只剩3個元素,為遞迴基之一
//分而治之
int mi =
(lo + hi)/2
;int x1l, x2l, x1r, x2r;
max2
(a, lo, mi, x1l, x2l)
;max2
(a, mi, hi, x1r, x2r);if
(a[x1l]
>a[x1r]
)else
}
測試**:
#include
void
max2
(int a,
int lo,
int hi,
int&x1,
int&x2)
;int
main()
return0;
}
ps: mi為什麼可以這樣算 mi = (lo+hi)/2
(雖然這個問題很簡單,但是我當初糾結了好久,所以還是把它記下來了。)
最直觀的演算法mi=lo+(hi-lo)/2
化簡mi=lo+(hi-lo)/2
=lo + hi/2 - lo/2
=(2*lo)/2 + hi/2 - lo/2
=(2*lo +hi - lo) /2
=(lo + hi) /2
也可以借助下面的直觀理解
遞迴求陣列最大值
遞迴求陣列最大值 使用遞迴當方式求陣列中最大的值 public class diguigetmax int mid l r 2 int leftmax getmax a,0,mid int rightmax getmax a,mid 1,r return math.max leftmax,right...
求出陣列的最大值和次大值
求陣列的最大值相對來說是比較簡單,只需要遍歷一遍陣列,不斷更新陣列的最大值,直到遍歷完成。自然語言描述 1.初始化最大值的角標 2.遍歷陣列,比較當前的最大值角標的元素和遍歷得到陣列元素的大小 如果陣列元素大於當前最大值,更新最大值角標為遍歷到的陣列元素角標,直到遍歷完成程式語言描述 int get...
找出陣列中的最大值和次大值
給定乙個含有n個元素的整型陣列,求其最大值和次大值 思想和上一題類似,同樣是用分治法,先求出左邊的最大值leftmax和次大值leftsecond,再求出右邊的最大值rightmax和次大值rightsecond,然後合併,如何合併呢?分情況考慮 1 如果leftmax rightmax,那麼可以肯...