求陣列的最大值相對來說是比較簡單,只需要遍歷一遍陣列,不斷更新陣列的最大值,直到遍歷完成。自然語言描述:
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 則肯定用到二分或者堆的思路,但是輸入的數沒有經過排序,而且題目要求的計算量也不允許排序。這樣,就肯定會用到類似堆的思路,但是直接構造堆等同於排序。堆的思想跟競標賽類似,都是父節點 子節點。...