1 回答

TA貢獻1998條經驗 獲得超6個贊
nth_element()是一個典型的部分排序算法。
它的第1和第3個參數,定義的是排序的范圍(或則說nth_element這個算法或函數的作用范圍),稱著first和last,是一個[ )區間。在你的例子,分別對應那個vector的begin和end;
第2個參數的意思是:如果一個序列的first和last半包含的范圍內,如果這個序列被排序了,那個第n個位置上的元素應該是什么。---- 白話的解釋就是:如果給你一堆數據,我想看看中間值是多少,第2大的數是什么? 你該如何解決呢? 全排序當然可以,但如果數據多,效率也許就差了。這是只有部分排序即可,也就是說只有這第n個的位置被排對了,那么其他的就不管了,排序就可以解釋了。-- 這是nth_element的應用意義。
以你的代碼為例:你的第2個參數是intVect.begin()+3,就是想看看intVect這個序列中,【如果排序的話】,它的第4個應該是多少?這個intVect如果全排序,應該是:
0 1 3 5 6 7 9,
因此nth_element在確保第4個元素=5的時候,就停止排序了。 因此你后面輸出intVect的值是:
1 0 3 5 9 6 7
就是第4個=5后,當時intVect的值。
一般在nth_element()后,都有一個類似這樣的語句:
12 | nth_element(intVect.begin(),intVect.begin()+3,intVect.end()); cout << intVect[3]<< endl; |
給你添加一點代碼,體會一下nth_element的概念,它其實可以有【第4個參數】的:
1234 | nth_element(intVect.begin(), intVect.begin() + intVect.size()/2, intVect.end()); cout << "The median is " << intVect[intVect.size()/2] << endl; nth_element(intVect.begin(), intVect.begin() + 1, intVect.end(), greater< int >()); cout << "The second largest is " << intVect[1] << endl; |
之后在看看intVect的輸出:
123 | The median is 5 The second largest is 7 9 7 6 5 3 1 0 |
- 1 回答
- 0 關注
- 346 瀏覽
添加回答
舉報