一種思路是利用兩次冒泡法,因為第一次冒泡,最大的在a[n-1],第二次冒泡後,次最大值在a[n-2]這樣直接返回即可。核心**如下:
for(int i=0; i<2; i++)
for(int j=0; ja[j+1])
swap(a[j], a[j+1]);
}return a[n-2];
但是這樣做,顯然效率不夠高,幾乎要遍歷兩次,有沒有遍歷一次就可以找到呢?
第二種思路:
首先看原始碼:
int find2max(int a, int n)
else if(a[i] > a[max2] && a[i] < a[max1])
max2 = i;
} return max2;
}
首先設定兩個索引max1,max2,分別用來存最大的和次最大的索引。然後遍歷一次,當a[i] > a[max1]時是一種情況,要進行交換;另外當a[i] < a[max1] 同時a[i] > a[max2]時,這種情況也要進行處理。注意,max1、max2的索引初值均為0, 有的人把max2設成-1,這是不夠嚴密的。另外,就是遍歷的時候,從第二個數開始遍歷即可,即i = 1開始往後遍歷。
這個演算法的複雜度是o(n),問題似乎很好解決了,但試問有比這更快的方法嗎?而且,如果不是讓找第二大的數,而是找第三大、第四大、第五大,或者第三小、第4小的數,上面這種思路顯然是走不通的。腫麼辦? 下篇接著說。
求陣列中第K大的數
本題的的陣列是可以包含重複元素的,且要求時間複雜度控制在o n 解題思路 陣列中第k大的數等價於排序陣列中第n k個數,直觀的想法是將陣列排序後取第n k個數即可,但是最快的排序演算法時間複雜度也是o nlogn 可以參考快速排序一次劃分的思想,將時間複雜度降低為o n 一次劃分可以講陣列分為三部分...
求陣列中第k大的數
文章裝載自 使用快排,第一趟快排過後,右邊的元素都比樞軸大,左邊的都比樞軸小。當我們要求第k大的數,只需要左邊的元素個數是len k,len是陣列總長度。第一次快排下來,設樞軸位置是mid,如果mid k,說明第k大元素應該在左邊序列中,遞迴左邊序列。當 mid k 時,說明k元素在右邊序列,遞迴右...
求陣列第K大的數
問題 有乙個大小為n的陣列a 0,1,2,n 1 求其中第k大的數。我們先分析原問題 有乙個大小為 n的陣列a 0,1,2,n 1 求其中第k大的數。我們先取特例,令k 1,那麼就是取最大的數,只要掃瞄一遍陣列就可以確定該值,如果k 2,則掃瞄兩邊陣列就可以確定第二大的數,依此類推下去,時間複雜度是...