第k大數字 快排,大根堆實現

2021-10-11 19:01:51 字數 1382 閱讀 8297

有乙個整數陣列,請你根據快速排序的思路,找出陣列中第k大的數。

給定乙個整數陣列a,同時給定它的大小n和要找的k(k在1到n之間),請返回第k大的數,保證答案存在。

class

finder

intpartition

(vector<

int>

&arr,

int left,

int right)

arr[left]

= arr[right]

;while

(left < right && arr[left]

>= pivot)

arr[right]

= arr[left];}

arr[left]

= pivot;

return left;

}int

findk

(vector<

int>

& a,

int left,

int right,

int k)

else

if(pivot > k-1)

}return-1

;}};

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。

class

solution

int headsize = input.

size()

; vector<

int>res;

if(k ==

0|| k > headsize)

return res;

if(k == input.

size()

)return vector<

int>

(input.

begin()

, input.

end())

;

res.

push_back

(input[0]

);swap

(input[0]

,input[

--headsize]);

while

(--k )

return res;

}void

heapinsert

(vector<

int>

& a,

int index)

}void

heapify

(vector<

int>

&arr,

int index,

int size)}}

;

最簡快排模板 第k大數

這個快排模板,還是記住吧。邊界太複雜了,搞不懂搞不懂 它的思路和普通快排不是很一樣 普通快排的思想從任選乙個數,正常選中間,然後在陣列中找到這個數的位置,選定,繼續把這個數的左邊和右邊繼續遞迴搞完 這個快排就其實思路也差不多,它把小於等於x的搞在左邊,大於等於x的搞在右邊,然後繼續遞迴,就排完了,簡...

快速排序 快排求第K大

快速排序 快排採用分治的策略,先從數列中取出乙個元素作為作為基準元素,以基準元素為標準,將問題分解為兩個子串行,使小於基準的子串行在左側,使大於等於基準元素的子串行右側,對兩個子串行再進行快速排序,最終得到排好序的序列。時間複雜度 o nlogn 空間複雜度o logn 快速排序是不穩定的 code...

尋找第K大的數(快排思想)

使用快排思想找第k大的數,演算法複雜度o n 1.以陣列a的第0位a 0 為參考基準base,將陣列劃分為兩個部分 如果找第k大的數,則將大於base的數往前挪,將小於base的數往後挪。如果找第k小的數,則與此相反。劃分過程與快排相同,使用兩個指標i和j分別指向陣列的首尾,根據指標所指元素與基準b...