問題描述:
在乙個無序的序列t中,尋找第k小的元素;
分析:
將序列t進行公升序排列,下標為k的元素即為第k小的數。(下標從1開始)。考慮到快速排序的過程,每次進行一次partition()函式,就將比軸線值小的數放在軸線左邊,比軸線大的值放在軸線右邊,即可確定乙個軸線值的下標位置s。下面分三種情況:
1:s==k 即已經找到下表為k的數,return t[s];
2 : s < k 即第k小值在軸線右邊;
3:s > k 即第k小值在軸線左邊;
再到相應的區間查詢即可快速找到結果。
**:
#include
using
namespace
std;
int partition(int r,int low,int high);
int selectmink(int a,int low,int high,int k);
int main()
int partition(int a,int low,int high)
while(iif(iint t=a[i];
a[i]=a[j];
a[j]=t;
j--;}}
return i;
}int selectmink(int a,int low,int high,int k)
else
return selectmink(a,low,s-1,k);
}
選擇問題(第k小元素)(分治法)
selection algorithm 選擇問題即第k小元素問題。解決該問題的基本思想與快速排序演算法相同,通過選擇基元進行劃分,從而知道第k小元素在 原始資料使用隨機函式生成。採用結構化程式設計,可以很容易改為從標準輸入或檔案讀入資料,只需要修改函式getdata即可。資料個數由巨集定義給出,也可...
求第k小元素
題目 給定線性序集中n個元素和乙個整數k,其中1 k n,要求找出這n個元素中第k小的元素。如果將這n個元素線性序排列時,如果不存在重複的數或者求第k個元素的時候,那麼第k個位置即為要找的元素。當k 1時,要找的就是最小值 而當k n時,則要找的則是最大值。憑藉著快速排序中的劃分函式,可以實現上面的...
陣列第k小的元素
要求複雜度在o n kua方法 使用分治策略,類似與快速排序的方法,先對陣列分組,然後判斷第k小的元素應該在哪個分組 然後遞迴該分組,最後求的第k小的元素 使用分段的思想求第k小的數 減治法 如 第1小的數是最小的數 思想 對於乙個陣列a 0.n 1 分段成a 0.s 1 a s a s 1.n 1...