選擇問題(第k小元素)(分治法)

2021-07-11 08:56:30 字數 1116 閱讀 5872

selection algorithm

選擇問題即第k小元素問題。

解決該問題的基本思想與快速排序演算法相同,通過選擇基元進行劃分,從而知道第k小元素在**。

原始資料使用隨機函式生成。

採用結構化程式設計,可以很容易改為從標準輸入或檔案讀入資料,只需要修改函式getdata即可。

資料個數由巨集定義給出,也可以輕鬆地改為輸入。

演算法有遞迴與非遞迴兩種過程,非遞迴過程是正解。

/*

* 問題描述:從n個數中,選出第k小(排序後排在第k個位置)的元素。

* * 選擇問題法程式

* */

#include #include #include #define n 7

void getdata(int , int);

void result_output(int );

int selectmink1(int a, int low, int high, int k);

int selectmink2(int a, int low, int high, int k);

int split(int a, int low, int high);

int main(void)

else

printf("input error: k=%d\n", k);

return 0;

}int selectmink1(int a, int low, int high, int k)

int selectmink2(int a, int low, int high, int k)

}int split(int a, int low, int high)

a[high] = part_element;

return high;

}void getdata(int d, int n)

void result_output(int a)

關鍵**(正解):

// 非遞迴選擇問題演算法程式

int selectmink2(int a, int low, int high, int k)

}

分治法求第k小元素(vc )

演算法 求一列數中的第k小元素,利用分治的策略進行遞迴求解。首先隨便指定乙個數,這裡我指定的是第乙個數為第k小元素記為randk,將陣列中其他的數與findk進行比較,比他小的放在左邊,大的放在右邊,如果randk左邊的元素個數為k 1個,說明findk就是你所要找的元素,如果左邊的元素個數 k 1...

選擇問題 第k小元素

問題描述 在乙個無序的序列t中,尋找第k小的元素 分析 將序列t進行公升序排列,下標為k的元素即為第k小的數。下標從1開始 考慮到快速排序的過程,每次進行一次partition 函式,就將比軸線值小的數放在軸線左邊,比軸線大的值放在軸線右邊,即可確定乙個軸線值的下標位置s。下面分三種情況 1 s k...

分治法尋找第k小元素演算法的優化

分治法尋找第k小元素演算法的優化 目的和意義 利用分治演算法尋找第k小元素並不是適用於所有情況,在處理一些問題時,按照傳統的分治的演算法似乎並不合理,舉個例子,在尋找一萬個元素中的第十小元素時利用傳統的尋找第k小元素的演算法會產生大量的冗餘,這時候利用每組的中位數並不合算,找中位數代價極大,然而效益...