個人心得:在買的書上看到的乙個經典分治題,題目意思就是給定乙個陣列,求第k小的數。
第一反應就是排序,然後返回第k-1位置的數就可以了,這樣演算法的複雜度是nlongn,在快速排序的基礎下還是挺不錯的。
不過為了學習分治法還是換種思路,這也是建立在快速排序的方法,因為快排是以第乙個作為標準,比他小的數在左邊,大的數在右邊。
所以此時就有nleft表示左邊的個數
1:如果nleft=k-1,那麼此時flag必然是第k小的數
2:如果大於,那麼就在左邊找就好了,問題規模變小了
3:如果小於,去右邊,不過此時選擇k-nelft-1(解釋,本**自動跳躍flag這個數所以還要減去1)
注意問題的轉移和基準的確定。
1 #include2 #include3 #include4 #include5 #include6 #include7using
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的大小關係可以確定這個數是在哪個部分,以此類推,進行遞迴...