1.問題
數學語言:給無序序列集中有n個元素,查詢次數m和乙個整數k,1<=k<=n,找出這n個元素中第k大的元素。
2.解析
利用快速排序,可以從序列中取乙個中點mid,然後把序列分成小於等於mid和大於等於mid的兩部分,由兩個部分的元素個數和k的大小關係可以確定這個數是在哪個部分,以此類推,進行遞迴查詢。
3.設計
if
(兩邊指標相交)
return-1
;if(兩邊指標重合)
return 當前元素;
i =quicksort
(a, l, r)
;//對當前序列進行快速排序
j = i - l +1;
//當前元素在當前序列的位置大小
if(j == k)
返回當前值;
else
if(j > k)
遞迴查詢左邊集合;
else
遞迴查詢右邊集合;
4.分析
最壞情況:
t(n)=t(n-1)+n-1
t(n)=o(n^2 )
平均值:
t(n)=t(n/2)+n-1
t(n)=o(n)
5.原始碼
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const
int maxn =
1e3+10;
#define ll long long
int i, j, k;
int n, m;
const
int inf =
0x3f3f3f3f
;const
int mod =
1e9+7;
int a[maxn]
;int
quicksort
(int a,
int l,
int r)
a[i]
= value;
return i;
}return-1
;}//main
intdivide
(int a,
int l,
int r,
int k)
intmain()
return0;
}
分治法尋找第k大的數
利用快速排序的思想 去做 include using namespace std int findkthmax int list,int left,int right,int k int main return 0 int findkthmax int list,int left,int right...
分治法找第K小的數PTA
分治法 找第k小的數 基本思路 用乙個基準數a 本題選用陣列的第乙個元素作為基準數 將s分割為兩部分,分別為小於等於a的s1和大於a的s2.記 s1 表示s1中元素的個數,s2 表示s2中元素的個數。這樣當 s1 k時,那麼第k小的數在s1中並且時s1中第k小的數 相反的,當 s1 define m...
選擇問題(第k小元素)(分治法)
selection algorithm 選擇問題即第k小元素問題。解決該問題的基本思想與快速排序演算法相同,通過選擇基元進行劃分,從而知道第k小元素在 原始資料使用隨機函式生成。採用結構化程式設計,可以很容易改為從標準輸入或檔案讀入資料,只需要修改函式getdata即可。資料個數由巨集定義給出,也可...