最小的K個數

2021-10-08 12:33:07 字數 1441 閱讀 3584

題目需要在無序的陣列中查詢出 最小的k個數,並且這k個數不要求有序輸出

所以我們只需要得到小於等於第k+1大 k-1 的數

複雜度分析:因為我們是要找下標為k的元素,第一次切分的時候需要遍歷整個陣列 (0 ~ n)找到了下標是 middle 的元素,假如 k 比 middle 小的話,那麼我們下次切分只要遍歷陣列 (0 ~ k-1)的元素就行啦,反之如果 k 比 middle 大的話,那下次切分只要遍歷陣列 (k+1~n) 的元素就行啦,總之可以看作每次呼叫 partition 遍歷的元素數目都是上一次遍歷的 1/2,因此時間複雜度是 n + n/2 + n/4 + … + n/n = 2n, 因此時間複雜度是 o(n)。

核心的快速排序方法

//主要方法

int[

]sort

(int

arr,

int low,

int high,

int k)

// 否則根據下標middle與k的大小關係來決定繼續切分左段還是右段。

return middle > k?

sort

(arr, low, middle -

1, k)

:sort

(arr, middle +

1, high, k);}

//將middle左右的陣列順序調整好,並返回middle的位置

intmiddlesort

(int

arr,

int low,

int high)

arr[low]

= middleval;

return high;

}}

最終**

class

solution

//主要方法

int[

]sort

(int

arr,

int low,

int high,

int k)

// 否則根據下標j與k的大小關係來決定繼續切分左段還是右段。

return middle > k?

sort

(arr, low, middle -

1, k)

:sort

(arr, middle +

1, high, k);}

//將middle左右的陣列順序調整好,並返回middle的位置

intmiddlesort

(int

arr,

int low,

int high)

arr[low]

= middleval;

return high;

}}

最小的K個數

問題描述 給定的n個整數,計算其中最小的k個數。最直觀的解法莫過於將n個數按公升序排列後輸出前k個。但是就效率來看,這種方法並不是最理想的。一種改進方法是借助快速排序中對陣列的劃分,以第k個元素對陣列進行劃分,使得比第k個數字小的數字都在其左邊,比其大的數字都在它的右邊。void swap int ...

最小的K個數

從 陣列中出現次數超過一半的數字 得到啟發,同樣可以基於partition函式來解決。一 o n 演算法 void getleastnumbers int input,int n,int output,int k else for int i 0 i k i output i input i 二 o...

最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,如果不讓使用sort的話,自己實現乙個,或者依次選取最小的 class solution public vectorgetleastnumbers solution vectori...