有這麼一類問題,是尋找區間內的第k大或者說第k小(實際上這兩個是乙個問題),解決演算法有排序,權值線段樹、主席樹、樹套樹等,但是要麼就是複雜度不滿意或者不好寫。根據快速排序的分治思路,我們還可以在o(n
)o(n)
o(n)
的時間內找到答案,但並不能保證有序,並且stl十分貼心地把這個演算法封裝到 nth_element 中,本文就是介紹這個介面地使用。
前言中提到,這個介面的期望複雜度是 o(n
)o(n)
o(n)
,我們可以假設每次選取的分段標誌為最優大致證明一下:
t (n
)=t(
n/2)
+n=t
(n/4
)+n+
n/2=
t(n/
(2i)
)+n+
n/
2...+n
/(2(
i−1)
)=n+
n/2+
...+
1=2∗
n−1=
o(n)
,其中(
i=lo
g(n)
+1).
t(n) = t(n/2) + n \\ = t(n/4) + n + n/2 \\ = t(n/(2^i)) + n + n/2 ... + n/(2^(i-1)) \\ = n + n/2 + ... + 1 \\ = 2*n - 1 = o(n),其中 (i = log(n) + 1) .
t(n)=t
(n/2
)+n=
t(n/
4)+n
+n/2
=t(n
/(2i
))+n
+n/2
...+
n/(2
(i−1
))=n
+n/2
+...
+1=2
∗n−1
=o(n
),其中
(i=l
og(n
)+1)
.至於劃分部分和快排一致,區別在於分治部分,具體實現略。
nth_element預設的比較子和一般的容器都是 less ,這在堆結構中會形成大根堆;在排序介面會形成從小到大排序;在這裡則會形成第k小的功能,如果把這個比較子換成greater或者自定義的乙個比較子介面則會形成乙個第k大。
對於每個引數的含義:
#include
using
namespace std;
intmain()
;nth_element
(arr, arr+
2, arr+10)
;//注意第1小對於下標0,以此類推
cout <<
"nth_element(arr, arr+3, arr+10) : "
;for
(int i =
0; i <
10; i++
) cout << arr[i]
<<
' ';
cout <<
"\n第3小的數是 : "
<< arr[2]
<< endl;
/** * 輸出:
* nth_element(arr, arr+3, arr+10) : 1 2 2 3 4 5 9 6 11 12
* 第3小的數是 : 2
*/int arr2[10]
=;nth_element
(arr2, arr2+
7, arr2+10)
;//求第3大轉化成求第10-3+1小問題
cout <<
"nth_element(arr2, arr2+7, arr2+10) : "
;for
(int i =
0; i <
10; i++
) cout << arr2[i]
<<
' ';
cout <<
"\n第3大的數是 : "
<< arr2[7]
<< endl;
/** * 輸出:
* nth_element(arr2, arr2+7, arr2+10) : 5 2 4 3 2 1 6 9 11 12
* 第3大的數是 : 9
*/int arr3[10]
=;nth_element
(arr3, arr3+
2, arr3+
10, greater<
int>()
);//求第3大轉化成求第10-3+1小問題
cout <<
"nth_element(arr3, arr3+3, arr3+10, greater()) : "
;for
(int i =
0; i <
10; i++
) cout << arr3[i]
<<
' ';
cout <<
"\n第3大的數是 : "
<< arr3[2]
<< endl;
/** * 輸出:
* nth_element(arr3, arr3+3, arr3+10, greater()) : 11 12 9 6 5 1 3 4 2 2
* 第3大的數是 : 9
*/int arr4[10]
=;nth_element
(arr4, arr4+
2, arr4+10,
(int a,
int b));
//求第3大轉化成求第10-3+1小問題
cout <<
"nth_element(arr4, arr4+2, arr4+10, (int a, int b)) : "
;for
(int i =
0; i <
10; i++
) cout << arr4[i]
<<
' ';
cout <<
"\n第3大的數是 : "
<< arr4[2]
<< endl;
/** * 輸出:
* nth_element(arr4, arr4+2, arr4+10, (int a, int b)) : 11 12 9 6 5 1 3 4 2 2
* 第3大的數是 : 9
*/return0;
}
C nth element排序演算法
函式標頭檔案 default 1 template void nth element randomaccessiterator first,randomaccessiterator nth,randomaccessiterator last custom 2 template void nth el...
C nth element函式用法學習
nth element 需要標頭檔案。典型參數列為 nth element randomit first,randomit nth,randomit last,compare comp less nth element的作用就是根據nth這個引數,把容器內的元素分為2組,nth之前的都比它小,nth...
介面使用 (JAVA
介面使用 題目描述 建立乙個名稱為vehicle的介面。在介面中新增兩個方法start 和stop 在兩個名稱分別為bike和bus的類中實現vehicle介面。建立乙個名稱為main的類,在main的main 方法中建立bike和bus物件,並訪問start 和stop 方法。如下 你的 將被嵌入...