快速選擇SELECT演算法實現

2021-06-29 04:22:48 字數 825 閱讀 7423

#include

#include

using namespace std;

typedef int data;  

#define swap(x,y)    

const static int num_array = 14;

// 快速選擇,平均時間複雜度o(n)

int quickselect( data* a, int beg, int end, int k )

pivot = a[beg];

i = beg;

j = end + 1;

// 將陣列分為小於pivot和大於pivot的兩部分

for ( ;; )

swap( a[beg], a[j] );

if ( j - beg  == k-1 )   // 如果小於pivot的數目剛好為k-1個,這返回該pivot

return a[j];

else if ( j - beg >= k ) // 否則,如果小於pivot的數目大於k-1個,則返回該部分中第k大的數

return quickselect( a, beg, j-1, k );

else

return quickselect( a, j+1, end, k-(j-beg+1) );

}int main()    

;    

// 尋找第k最小數    

int k = 4;    

int i = quickselect(array, 0, num_array - 1, k);    

cout << "第"<

//以下為參考

快速選擇SELECT演算法的實現

本節,咱們將依據下圖所示的步驟,採取中位數的中位數選取樞紐元的方法來實現此select演算法,不過,在實現之前,有個細節我還是必須要提醒你,即上文中2.2節開頭處所述,陣列元素索引是從 0.i 開始計數的,所以第k小的元素應該是返回a i a k 1 即k 1 i。換句話就是說,第k小元素,實際上應...

快速選擇演算法

摘要 選擇第k小的元素,用快速排序的思想可以以平均o nlogn 的時間界做到.1 首先找到中間值,並且進行排序。2 如果左邊的子串行的長度 s1 k 1,那麼很顯然中間值就是所求.3 如果左邊的子串行的長度 s1 k,那麼顯然這個所求元素就在子串行s1裡面,遞迴的在s1裡面求解 4 如果 s1 k...

快速選擇演算法

快排的每一趟,數軸的左邊都會是 x 的,右邊都是 x 的。左邊元素的個數是 s1 j l 1,如果k s1 的話,那麼下次遞迴的區間就是左邊,否則右邊。直到 l r 時返回q l 時間複雜度 o n c include using namespace std const int n 1e5 10 i...