選擇第n大的數(分治法和排列實現)

2022-07-30 18:30:18 字數 1117 閱讀 2951

個人心得:在買的書上看到的乙個經典分治題,題目意思就是給定乙個陣列,求第k小的數。

第一反應就是排序,然後返回第k-1位置的數就可以了,這樣演算法的複雜度是nlongn,在快速排序的基礎下還是挺不錯的。

不過為了學習分治法還是換種思路,這也是建立在快速排序的方法,因為快排是以第乙個作為標準,比他小的數在左邊,大的數在右邊。

所以此時就有nleft表示左邊的個數

1:如果nleft=k-1,那麼此時flag必然是第k小的數

2:如果大於,那麼就在左邊找就好了,問題規模變小了

3:如果小於,去右邊,不過此時選擇k-nelft-1(解釋,本**自動跳躍flag這個數所以還要減去1)

注意問題的轉移和基準的確定。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8#define maxi 105

9int

a[maxi];

10int

b[maxi];

11int

n,k;

12void

geta()

16int

sorta()

20int quickcheck(int left,int right,int

ki)21

while(a[i]31do

32while(a[j]>flag);

35if(i>=j) break;36

swap(a[i],a[j]);37}

38int nleft=j-left;

39if(nleft==ki-1) return

flag;

40 a[left]=a[j];

41 a[j]=flag;

42if(nleft1)43

return quickcheck(j+1,right,ki-nleft-1

);44

else

45return quickcheck(left,j-1

,ki);46}

4748

intmain()

49

選擇第n大的數

借鑑快速排序演算法,返回每趟確定的乙個元素的位置,與n比較。在快速排序中使用隨機生成的樞軸,如果資料排列均勻,也可以選第乙個數作為樞軸。created by dgm on 2020 1 3.include include include using namespace std int n int a...

分治法尋找第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小 大的數

1.問題 數學語言 給無序序列集中有n個元素,查詢次數m和乙個整數k,1 k n,找出這n個元素中第k大的元素。2.解析 利用快速排序,可以從序列中取乙個中點mid,然後把序列分成小於等於mid和大於等於mid的兩部分,由兩個部分的元素個數和k的大小關係可以確定這個數是在哪個部分,以此類推,進行遞迴...