l通過分治策略,選取第k小元素。
通過快速排序和分治的思想,每次隨機選取主元,判斷小於主元的元素的個數,如果個數大於k則遞迴尋找左半段,如果個數小於k則遞迴尋找右半段
1時間複雜度:o(nlogn)int find_kth(int l, int r, int
k) 24
25 i++, j--;
2627}28
29if (cnt >= k)
3435
else
4041 }
空間複雜度:o(n)
1 #include2 #include3 #include4完整**using
namespace
std;
5int a[100010];6
void swap(int& x, int&y)
11int random(int l, int r)
14int find_kth(int l, int r, int
k) 26 i++, j--;27}
28if (cnt >= k)
31else 34}
35int
main()
演算法分析與設計 分治演算法
在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是 分而治之 就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法 快速排序,歸併排序 傅利葉變換 快速傅...
《演算法分析與設計》 作業六 選取第k小元素
問題 給出乙個陣列,求陣列中第k小的元素。解析首先,隨機在陣列中選擇乙個數作為劃分值。然後,進行快排,將小於劃分值的數放到陣列左邊,等於劃分值的數放到陣列中間,大於的放到陣列右邊,然後判斷k與等於劃分值區域的相對關係,如果k正好在等於區域,那麼陣列第k小的數就是劃分值,如果k在區域的左邊,那麼我們遞...
演算法分析與設計 分治法 動態規劃
優化原則 最優子結構性質 問題的最優解中,每乙個子問題本身即是該子問題的最優解 即最優決策序列的任何子串行本身一定是相對於子串行的初始 結束狀態的最優決策序列 分解 盡量平衡 分解成規模盡量接近的子問題 解決 遞迴地解兩個規模為n 2的子問題 2.解決 遞迴地解兩個規模為n 2的子問題 合併描述最優...