《演算法分析與設計》 作業六 選取第k小元素

2021-10-04 16:43:02 字數 990 閱讀 9155

問題

給出乙個陣列,求陣列中第k小的元素。

解析首先,隨機在陣列中選擇乙個數作為劃分值。然後,進行快排,將小於劃分值的數放到陣列左邊,等於劃分值的數放到陣列中間,大於的放到陣列右邊,然後判斷k與等於劃分值區域的相對關係,如果k正好在等於區域,那麼陣列第k小的數就是劃分值,如果k在區域的左邊,那麼我們遞迴對左邊再進行上述過程,右邊也一樣。

在選取劃分值時:

(1)我們將陣列每5個相鄰的數分成一組,後面的數如果不夠5個數也分成一組。

(2)對於每組數,我們找出這5個數的中位數,將所有組的中位數構成乙個mid陣列。

(3)我們再求這個中位數陣列中的中位數,此時所求出的中位數就是那個number。

(4)通過這個number進行快速排序過程。

設計

int

select_kth_smallest

(int root,

int begin ,

int end,

int k)

int div=

findmidofmid

(root, begin, end)

;partation

(root, begin, end, div);if

(k>=a[0]

&&k<=a[1]

)else

if(k)else

}

分析
假設總數組的數字個數是n,那麼中位數陣列中數字的個數就是 n / 5。中位數陣列中有一半的數比這個中位數中的中位數大,所以總共有 n / 10個數比這個中位數中中位數大。加上在比大於中位數中的中位數大的中位數大的數,所以至少有n / 10 + ( 2n ) / 10 = ( 3n ) / 10 個數比中位數中的中位數大。那麼,經過快速排序,最壞情況也能夠使選區在陣列的 ( 3n ) / 10 或者 ( 7n ) / 10 的位置。所以,時間複雜度為o(n)。

原始碼

原始碼在這裡

歡迎批評指正~

演算法設計分析 分治策略選取第k大元素

l通過分治策略,選取第k小元素。通過快速排序和分治的思想,每次隨機選取主元,判斷小於主元的元素的個數,如果個數大於k則遞迴尋找左半段,如果個數小於k則遞迴尋找右半段 1 int find kth int l,int r,int k 24 25 i j 2627 28 29if cnt k 3435 ...

演算法設計與分析作業(1)

1.dijkstra求單源最短路徑 先進行存圖操作,將帶權有向圖用鄰接矩陣來表示 for int i 0 i u v dist map u v dist 用dis陣列來儲存0點到其他每乙個點的最短距離,初始時dis i map 0 i 接下來進行鬆弛操作,找出最短距離 首先0點為q集合中的點,0 1...

演算法分析與設計 作業1

問題 舉乙個例項,畫出採用prim演算法構造最小生成樹的過程 1 首先選定頂點1加入最小生成樹集合 2 以頂點1作為最小生成樹集合,尋找到其餘頂點構成的未選集合中權值最小的一條邊,此處尋找到頂點2,並將頂點2加入集合。3 以頂點2 3作為最小生成樹集合,尋找至其餘頂點構成集合權值最小的邊,此處找到頂...