#include
#include
#include
template
int partition(type a,int p,int r)
a[p]=a[j];
a[j]=x;
return j;
}template
int randamizedpartition (type a,int p,int r)
template < class type>
type randamizedselect(type a,int p,int r,int k)
for(int i=0;i<=(r-p-4)/5;i++)
//將a[p+5*i]至a[p+5*i+4]的第三小元素與a[p+i]交換位置;
type x=selexr)a,p,p+(r-p-4)/5,(r-p-4).10;
int i=partition(a,p,r,x),j=i-p+1;
if(k<=j)
return select(a,p,i,k);
else return select(n,i+1,r,k-j);
void main()
;cout<}
分治法 線性時間選擇(求第k小數)
給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k小的元素,這裡給定的線性集是無序的 線性時間選擇隨機劃分法可以模仿隨機化快速排序演算法設計。基本思想是對輸入陣列進行遞迴劃分,與快速排序不同的是,它只對劃分出的子陣列之一進行遞迴處理。利用隨機函式產生劃分基準,將陣列a p r ...
N個數,求第K大數
有n個不重複的數,這n個數可以放入記憶體中,讓你用最快的方法找到第k大的數。解答 一般情況我們可能考慮,先將n個數排序 快排序 堆排序 然後可以得到結果。但是當n很大時這樣做的效率會很低。所以我們提出一種更高效的方法 利用快速排序的特點 第一遍排序會確定乙個數的位置,這個數左邊都比它大,右邊都比他小...
N個數,求第K大數
今天同學給我出了一道題是這樣的 有n個不重複的數,這n個數可以放入記憶體中,讓你用最快的方法找到第k大的數。解答 一般情況我們可能考慮,先將n個數排序 快排序 堆排序 然後可以得到結果。但是當n很大時這樣做的效率會很低。所以我們提出一種更高效的方法 利用快速排序的特點 第一遍排序會確定乙個數的位置,...