求陣列的最大值和次大值 (迭代 遞迴)

2021-10-02 05:19:48 字數 1518 閱讀 5052

參考:《資料結構》鄧俊輝

求陣列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,那麼可以肯...