分治法查詢第k小 大的數

2021-10-06 12:23:44 字數 1353 閱讀 8580

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即可。資料個數由巨集定義給出,也可...