「6.5.7選第k小元素:特定分治策略」以s中的某個元素m作為劃分標準,將s劃分為兩個子陣列s1和s2,把這個陣列中比m小的都放入s1的陣列中,陣列s1的元素個數是|s1|個;把這個陣列中比m*大的都放入s2的陣列中,陣列s2的元素個數是|s2|個。在給出的乙個陣列s中,找到第k小的數。
若k若k=|s1|+1,則m*就是要找的第k小元素。
若k>|s1|+1,則原問題歸納為在陣列s2中找第n−|s1|−1小的子問題。
輸入: n個數的陣列s,正整數k
輸出: s中的第k小元素
1.將s劃分成5個一組,共「n/5」個組。
2.每組找乙個中位數,把這些中位數放到集合m中
3. m←select(m,「|m|/27」 //選m的中位數m,將s中的數劃分成a,b,c,d四個集合
4.把a和d中的每個元素與m比較,小的構成s1,大的構成s2 ;
5. s1←s1∪c;s2←s2∪b
6. if k=|s1|+1 then 輸出m
7. else if k≤|s1 |
8.then select(s1, k)
9.else select(s2, k-|s1|-1)
int
select
(int
*a,int len,
int k)
for(
int i =
0; i < cnt; i++
)int m_s =
select
(m, num, num /2+
1);for
(int i =
0; i < cnt; i++
)else
if(a[
5* i +2]
== m_s)
else
}for
(int i =
5* cnt; i < len; i++)if
(k == num_s1 +1)
return m_s;
else
if(k <= num_s1)
return
select
(s1, num_s1, k)
;else
return
select
(s2, num_s2, k - num_s1 -1)
;}
時間複雜度是o(n) 選擇問題之特定分治策略
設 l 是 n 個元素的集合,從 l 中選取第 k 小的元素,其中 1 k n.這裡 的第 k 小元素是指,當 l 按從小到大排好序之後,排在第 k 個位置的元素。解決該問題用到的是分治思想。下面引用老師的分析 演算法思想 int select int a,int left,int right,in...
Q6 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。最簡單的方法是遍歷陣列得到最小的元素,演算法複雜度是o n 但是沒有利用...
演算法實驗6 選第k小元素 特定分治策略
用特定的分治策略,選第k小的元素。設 l是n個元素的集合,從 l 中選取第k小的元素,其中 1 k n.這裡的第k小元素是指,當 l 按從小到大排好序之後,排在第k個位置的元素。k s1 1,m 就是所要找的第k小的數 以m 為劃分標準後,比m 小的有 s1 個,如果恰巧k s1 1,則m 就是所要...