遞迴分治 選擇問題

2021-09-24 20:45:18 字數 640 閱讀 8042

對於給定該元素的n個元素的陣列a[0:n-1],要從中找出第k小的數

問題思路:很容易想到該問題的思路為對該陣列進行排序,然後選擇第k小,但複雜度較高,即使使用較好的排序方法,演算法的時間複雜性也為o(nlogn),本題可借助快速排序的思想進行求解,我們只需要確定該元素是不是第k小即可,無需對整個陣列進行排序,選擇軸值進行交換,看軸值前的個數是否為k-1個,而無需關心其順序(因為軸值前的都比軸值小,我們只要確定大小即可,無需知道順序)。

演算法實現如下:

#includeusing namespace std;

int a[100];

int select(int left,int right,int k);

int main()

//演算法核心

cout<=right)

int start = left+1;

int end = right;

int p = a[left];

while(true)

if (start>=end)

std::swap(a[start],a[end]);

} if (end-left+1 == k)

else

else

}}

眾數問題(遞迴 分治)

所謂眾數,就是對於給定的含有n個元素的多重集合,每個元素在s中出現次數最多的成為該元素的重數,多重集合s重的重數最大的元素成為眾數。例如 s 則多重集s的眾數是2,其重數為3。現在你的任務是 對於給定的由m個自然數組成的多重集s,計算出s的眾數及其重數。解題思路 1 快速排序 2 求中位數 3 計算...

眾數問題(遞迴分治策略)

所謂眾數,就是對於給定的含有n個元素的多重集合,每個元素在s中出現次數最多的成為該元素的重數,多重集合s重的重數最大的元素成為眾數。例如 s 則多重集s的眾數是2,其重數為3。現在你的任務是 對於給定的由m個自然數組成的多重集s,計算出s的眾數及其重數。解題思路 1 快速排序 2 求中位數 3 計算...

棋盤覆蓋問題(分治,遞迴)

在乙個2 k 2 k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。該棋盤為特殊棋盤,紅色的方格為特殊方格。棋盤覆蓋問題是指,要用圖2中的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。該問題就是在考察...