1. 程式人生 > >查詢演算法——找到序列中第二大的數

查詢演算法——找到序列中第二大的數

今天來說一個簡單的需求:在一個序列中找到第二大的元素。

一眼看到這個問題,感覺解決的方法有很多,因為這並不是一個困難的問題。隨便一想,能有下面幾種解法:

1 首先排序,然後取第二個位置的元素

2 迴圈遍歷元素序列,找到最大的元素,然後將其移除。再重複此過程,得到第二大的元素

當然還有其他的思路,這裡就不一一列舉了。如果大家有什麼好的想法,可以給我留言,咱們一起探討。

仔細分析一下,不難發現,上面的方法雖然可以達到目的,但是效率都不高。第一種方法相當於一次排序過程,最快也要O(nlogn)的時間才能完成。而第二種方法需要迴圈遍歷序列兩次,O(n)+O(n)的時間複雜度雖然不是無法接受,但畢竟還是要迴圈兩次。對於我們寫軟體的人來說,顯然希望程式碼是“完美”的。因此在這裡,提出一個只迴圈一次的方法,供大家借鑑參考。如果大家有好方法,歡迎提出。

廢話不說,下面介紹演算法思路:

我們既然可以迴圈遍歷一次得到最大的元素,為什麼不能儲存住第二大的元素呢?當然可以,我們在比較元素大小時,只要把小的儲存起來,經過一遍迴圈,這個元素就是第二大的元素了

程式碼就更簡單了

複製程式碼
int find_second_biggest(vector<int> &v){
        int len = v.size();
        int max,second;
        if (len < 2){
                return -1; 
        }
        if (v[0]>v[1]){ 
                second = v[1
]; max = v[0]; } else{ second = v[0]; max = v[1]; } for (int i=2; i< len; i++){ if(max < v[i]){ second = max; max = v[i]; } else
if (second < v[i]){ second = v[i]; } } return second; }