輸入:一系列數a[0]...a[n-1]和乙個整數k
輸出:這列數中第k小的數
同樣的問題在上篇文章中用快速排序模型,我們得到的平均時間複雜度是o(n),但是遺憾的是最壞情況會達到o(n^2)。這篇文章中我們還是使用快速排序的模型,但是改變了劃分的方式,這個演算法會保準得到乙個很好的劃分。將該演算法叫做select,具體如下:
1.將輸入陣列劃分為n/5組,每組有5個元素,且剩下的至多有一組的元素小於5個。
2.尋找這n/5個組中每個組的中位數,可以將每組做一次排序,然後選取每組的第三個元素。
3.對於第2部找出的n/5個中位數遞迴的呼叫select函式求出其中位數x.(約定偶數個中位數為其較小的中位數)
4.按照找到的中位數x將陣列劃分為兩個部分,求得小於或者等於x的元素有q個
5.如果k==q則返回x,若k
#include#includeusing namespace std;
int select(int a, int n,int k);
int main();
cout << select(a, 10,5) << endl;
return 0;
}int partition(int a,int low,int high, int x)
a[low] = x;
return low;
}int s_sort(int a,int low,int high, int k)
for (i = 0; i k)
return s_sort(a, low, j + 1, k);
else
return s_sort(a, j + 1, high, k - q);
}int select(int a, int n, int k)
由於每次劃分至少有3n/10-6個元素大於x,3n/10-6個元素小於x,從而下次遞迴呼叫規模至多為7n/10+6,得到遞迴式:
t(n)<=t(n/5)+t(7n/10-+6)+o(n),t(1)=o(1).最後解得t(n)=o(n).於是得到了最壞情況為線性時間複雜度。
最壞情況為線性時間的選擇演算法
題目 在n個元素的無序陣列中選擇第k 1 k n 小元素。當k 1時,相當於找最小值。當k n時,相當於找最大值。當k n 2時,稱中值。要求 線性時間內完成,即o n 演算法解析 通過執行下列步驟,演算法select可以確定乙個有n 1個不同元素的輸入陣列中第i小的元素。如果n 1,則select...
最壞情況線性時間選擇O n
題目 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k小的元素,這裡給定的線性集是無序的 具體解題 這裡我們將所有的數 n個 以每5個劃分為一組,共 n 5 組 將不足五個的那組忽略 然後用任意一種排序演算法 因為只對五個數進行排序,所以任取一種排序法就可以了,這裡我選用氣泡...
最差情況為線性時間的選擇
這個演算法寫了我好久,在這裡記一下。演算法的原理是利用中位數來作為劃分元素選擇第m小的元素,中位數需要遞迴自身來求得。演算法的最優,平均,最差時間複雜度都為o n 相對於隨機演算法改善了最差時間複雜度。和快排用了同樣的partition,但是這個演算法所使用的pivot是確定的,即中位數。版本為go...