求出陣列的最大值和次大值

2021-06-29 11:24:46 字數 1163 閱讀 8819

求陣列的最大值相對來說是比較簡單,只需要遍歷一遍陣列,不斷更新陣列的最大值,直到遍歷完成。自然語言描述:

1. 初始化最大值的角標

2. 遍歷陣列,比較當前的最大值角標的元素和遍歷得到陣列元素的大小;

如果陣列元素大於當前最大值,更新最大值角標為遍歷到的陣列元素角標,

直到遍歷完成

程式語言描述:

int getmax(int arr)

}return arr[max];

}

分析演算法,基本語句共執行n次(假設陣列長度為n),時間複雜度o(n)。

如果要找出次大值,一開始先是考慮的是用2次冒泡,次大值就能找出下面是簡單的程式**

int getsubmax(int arr) 

}return arr[arr.length - 2];

}

但是要遍歷陣列兩次,效率肯定還是不好,所以採用下面的描述:

1. 設定最大值和次大值的角標maxindex,submaxindex

2. 比較頭兩個元素大小來初始化兩個角標

3. 從第3個元素開始遍歷,取陣列元素arr[i],如果maxindex[i],

次大值取代最大值,submaxindex = maxindex,更新最大值maxindex = i;

反之,如果submaxindex[i],更新次大值submaxindex = i;

程式語言描述:

int getsubmax(int arr)  else 

//注意從第三個元素開始比較

for (int i = 2; i < arr.length; i++) else

if (arr[i] > arr[submaxindex])

}return arr[submaxindex];

}

通過這樣的比較,能同時得出最大值與次大值,而且基本語句執行的次數僅為n-2次,所以時間複雜度為o(n)。

一開始並沒有加入前兩個元素的比較,直接初始化兩個索引都為0,但是後來發現程式還不夠完美,當測試最大值就恰好就是第乙個值時,結果次大值也是最大值,顯然不滿足演算法的確定性原則,於是在原來基礎上改進,先確定兩組索引,從第三個元素開始比較,結果符合預期了。

找出陣列中的最大值和次大值

給定乙個含有n個元素的整型陣列,求其最大值和次大值 思想和上一題類似,同樣是用分治法,先求出左邊的最大值leftmax和次大值leftsecond,再求出右邊的最大值rightmax和次大值rightsecond,然後合併,如何合併呢?分情況考慮 1 如果leftmax rightmax,那麼可以肯...

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

參考 資料結構 鄧俊輝 求陣列a 在區間 lo,hi 內的最大值和第二大值。返回最大值的下標x1和第二大值的下標x2 迭代1 void max2 int a,int lo,int hi,int x1,int x2 迭代2 相對於迭代1不會改進最壞情況下的時間複雜度 void swap int x,i...

最大值和次大值問題的最優演算法

輸入 n個數,最壞情況下用 n logn 2 次比較找出當中的最大值和次大值。解題思想 根據題意出現 logn 則肯定用到二分或者堆的思路,但是輸入的數沒有經過排序,而且題目要求的計算量也不允許排序。這樣,就肯定會用到類似堆的思路,但是直接構造堆等同於排序。堆的思想跟競標賽類似,都是父節點 子節點。...