設 l 是 n 個元素的集合,從 l 中選取第 k 小的元素,其中 1<=k<=n.這裡
的第 k 小元素是指,當 l 按從小到大排好序之後,排在第 k 個位置的元素。
解決該問題用到的是分治思想。
下面引用老師的分析
演算法思想:
int
select
(int a,
int left,
int right,
int k)
int q = p /5;
//分為q組
int* m = new int
[q];
for(遍歷分組)
//對中位數陣列進行排序得到mid
for(遍歷陣列)
if(若小於mid的數超過k個)
return
select
(a1,
0, count1, k);if
(若小於mid的數加上等於mid的數超過k個)
return mid;
//其餘情況
return
select
(a3,
0, count3, k - count1 - count2)
;}
下面引用老師的分析
所以最後推導出演算法時間複雜度為o(n)
Q6 特定分治策略
6.5.7選第k小元素 特定分治策略 在給出的乙個陣列s中,找到第k小的數。以s中的某個元素m作為劃分標準,將s劃分為兩個子陣列s1和s2,把這個陣列中比m小的都放入s1的陣列中,陣列s1的元素個數是 s1 個 把這個陣列中比m 大的都放入s2的陣列中,陣列s2的元素個數是 s2 個。若k若k s1...
分治策略之棋盤覆蓋問題
1 引出 首先用合併排序來引出我們今天的主角,合併排序即使用了分治的策略,它將所要排序的區間劃分為2個子區間,將這兩個子區間分別進行遞迴排好順序,然後合併這兩個子區間 合併過程運用了簡單的雙指標演算法 即獲得原問題的解。其實棋盤覆蓋問題也是這樣的。2 主角登場 問題 在乙個2k 2k個方格組成的棋盤...
分治策略之合併排序問題
基本思想 將待排序元素分成大小大致相同的2個子集合,分別對2個子集合進行排序,最終將排好序的子集合合併成為所要求的排好序的合。例如 演算法 mergesort的遞迴過程可以消去。合併排序 遞迴 include using namespace std template void copy type a...