(演算法練習) 隨機選擇演算法

2021-10-02 07:05:49 字數 895 閱讀 9517

《演算法練習》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...