對於給定該元素的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型骨牌不得重疊覆蓋。該問題就是在考察...