演算法思想:利用快速排序的方法將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...