《演算法練習》p149
案例的**:
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn =
100010
;int a[maxn]
,n;//a存放所有整數,n為其個數
//隨機選擇主元,對區間[left,right]進行劃分
intrandpartition
(int a,
int left,
int right)
a[left]
= a[right]
;while
(left<= temp)
a[right]
=a[left];}
a[left]
= temp;
return left;
}//隨機選擇演算法,從a[left,right]中找到第k大的數,並進行劃分
void
randselect
(int a,
int left,
int right,
int k)
else
}int
main()
randselect
(a,0
,n -
1,n/2)
;for
(int i =
0;i 2;i++
)printf
("%d\n"
,(sum - sum1)
- sum1)
;return0;
}
隨機選擇演算法
問題描述 本文主要討論這樣乙個問題 如何從乙個無序的陣列中求出第k大的數。這個問題最直接的想法是對陣列排一下序,然後直接取出第k個元素即可,這樣做法需要o nlogn 的時間複雜度。這個方法比較簡單,在執行時間允許的情況下當然選這個方法 下面介紹隨機選擇演算法,它對任何輸入都可以達到o n 的期望時...
隨機選擇演算法
如何求解無序陣列中第k大的數?問題 將陣列劃分為兩個子集,元素個數分別為n1,n2,兩個子集各自元素之和分別為s1,s2,使 s2 s1 盡可能大,使 n1 n2 盡可能小。求 s2 s1 分析 僅尋找陣列中第n 2大的數,將陣列劃分為兩個集合,乙個子集的元素都小於這個數,另乙個子集的元素都大於這個...
隨機選擇演算法
討論一種常見的演算法問題,topk問題,即從乙個無序陣列中求出第k大的數,比如陣列,第三大的數是5,第五大的數是9。首先最簡單的方法是先排序,然後直接取出第k大元素,但是樣最好的時間複雜度也得到o nlogn 隨機選擇演算法可以到o n 的複雜度。原理有點類似於快速排序演算法,首先看一下快排中的ra...