#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...