原來stl我還是有很多不知道的地方
stl 採用的演算法是: 當陣列長度 <= 3時, 採用插入排序。
當長度 > 3時, 採用快排 partition 的思想,也就是說類似快速排序(這裡不妨假設是降序排列);
快排partition思想,隨機選擇乙個分界點,進行一次劃分。劃分結束後,考察劃分點現在的位置i:
如果待求的第k大在劃分點後面,那麼在a[i+1:len(a)]子串行中尋找第k-i-1大的數字;
如果待求點在劃分點前面,那麼在a[0:i-1]子串行中尋找第k大的數字
如果正好i=k,返回就完了
#include#include#includeusing namespace std;
int main()
puts("");
nth_element(a, a + 3, a + 10);
cout << a[3] << endl;
return 0;
}
求第K大的數
已知 n個數字各不相同,求其中第 k大的數是多少?1 k n 10000 這是一道簡單的試題,我們完全可以套用常用的快速排序模型來解決,即對所有數字進行排序,然後取出第 k大的數字輸出即可,該演算法的時間複雜度為o nlog2n 快速排序的基本思想關鍵在於不斷調整使分治點左邊的數不大於 或不小於 分...
求第k大的數
求第k大的數 給定乙個長度為n 1 n 1,000,000 的無序正整數序列,以及另乙個數k 1 k 1,000,000 關於第k大的數 例如序列中第3大的數是4。輸入第一行兩個正整數m,n。第二行為n個正整數。輸出第k大的數。樣例輸入 copy 6 31 2 3 4 5 6 樣例輸出 copy 4...
尋找第K大的數字
include using namespace std 快速排序的劃分函式 int partition int data,int i,int j 將 x的元素換到左邊區域 將 x的元素換到右邊區域 if i r l 1 k 1 k應該在 1,r l 1 之間 throw std exception ...