分治法 線性時間選擇

2021-10-10 00:18:40 字數 719 閱讀 3855

演算法思想:利用快速排序的方法將a[p:r]被劃分成兩個子陣列a[p:i]和a[i+1:r],使a[p:i]中的每個元素都不大於a[i+1:r]中每個元素。接著演算法計算子陣列a[p:i]中元素個數j。如果k≤j,則第k小的數落在左區間,否則落在右區間,直到k=j時,找到第k小的數。

對於有重複數字的無法解決。其實維護小頂堆感覺更好,無論時間複雜度還是**複雜程度。

int

partiotion

(int a,

int p,

int r)

swap

(a[i]

, a[j]);

//交換兩個位置不正確的元素

} a[p]

= a[j]

; a[j]

= x;

return j;

}int

randomizedpartition

(int a,

int p,

int r)

intrandomizedselect

(int a,

int low,

int high,

int k)

int i =

partiotion

(a, low, high)

;int j = i - low +1;

if(k <= j)

else

}

分治法 線性時間選擇

問題 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k小的元素,演算法的複雜度為o n 思路分析 首先,假如我們要找最大或者最小的元素,那麼只需遍歷一遍序列即可,複雜度為o n 假如要找第k大的元素,k n logn或者k n nlogn時,利用堆排序,時間複雜度仍然可以達到...

分治法 線性時間選擇(求第k小數)

給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k小的元素,這裡給定的線性集是無序的 線性時間選擇隨機劃分法可以模仿隨機化快速排序演算法設計。基本思想是對輸入陣列進行遞迴劃分,與快速排序不同的是,它只對劃分出的子陣列之一進行遞迴處理。利用隨機函式產生劃分基準,將陣列a p r ...

演算法 線性時間選擇 C C

給定線性序集中n個元素和乙個整數k,n 2000000,1 k n,要求找出這n個元素中第k小的數。第一行有兩個正整數n,k.接下來是n個整數 0 ai 1e9 輸出第k小的數 6 3 1 3 5 2 4 6 3利用快速排序可以找出第k小的,加上隨機函式改進一下 ac include include...