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小元素的演算法會產生大量的冗餘,這時候利用每組的中位數並不合算,找中位數代價極大,然而效益...