無序數字中位數 如何在無序陣列中查詢第K小的值

2021-10-14 10:41:55 字數 2735 閱讀 1118

如題:給定乙個無序陣列,如何查詢第k小的值。

例子如下:

在乙個無序陣列,查詢 k = 3 小的數

輸入:arr =輸出:7在乙個無序陣列,查詢 k = 4 小的數

輸入:arr =輸出:10幾種思路如下和複雜度分析如下:

(1)最簡單的思路直接使用快排,堆排或者歸併排,排序之後取陣列的k-1索引的值即可,時間複雜度為o(nlogn)

(2)用大小為k的陣列存前k個數,然後找出這裡面最大的值kmax,耗時o(k), 遍歷剩餘的數,如果有小於裡面最大的數,就放進去替換掉當前最大的,依次遍歷至結束,每次比較前都得找出kmax,故總的時間複雜度為:o(nk)

(3)使用大頂堆,初始化為k個值,然後後面從k+1開始,依次讀取每個值,判斷當前的值是否比堆頂的值小,如果小就移除堆頂的值,新增這個小的值,依次處理完整個陣列,取堆頂的值就得到第k小的值。 時間複雜度為:建堆的時間為o(k),每次調整最大堆結構時間為o(lgk),從而總的時間複雜度為o(k + (n-k)lgk)(適合大資料量)

(4)利用快排找基準的原理,可以在平均時間複雜度o(n)級別完成,當然最壞的情況下是o(n2)與快排的最壞情況一樣,但由於平均是o(n)的時間複雜度,所以這種方式一般認為是最優的解法。

原理如下: 根據題目描述,如果是第k小的值,那就說明在公升序排序後,這個值一定在陣列的k-1的下標處,如果在k-1處,也就是說只要找到像這樣的左邊有k個數比k小(可以是無序的,只要小就可以了),那麼這個下標的值,就是我們要找的值,利用這個思想我們就可以使用快排的思想,來快速的找基準值的index(陣列下標從0開始),如果恰好碰到了基準值的下標index+1=k,那就說明基準值index所在下標的值,就是我們要找的結果。

下面的**就是基於第四種思路來實現的,其他的方式,有興趣的可以自己研究一下。

注意,如果思路理解了,那麼該題目的變形也比較容易處理,比如

(1)如給定乙個無序陣列,查詢最小/大的k個數,或者叫前k小/大的所有數。

剖析:思路是一樣,只不過在最後返回的時候,要把k左邊的所有的數返回即可。

(2)給定乙個大小為n陣列,如果已知這個陣列中,有乙個數字的數量超過了一半,如何才能快速找到該數字?

剖析:有乙個數字的數量超過了一半,隱含的條件是在陣列排過序後,中位數字就是n/2的下標,這個index的值必定是該數,所以就變成了查詢陣列第n/2的index的值,就可以利用快排分割槽找基準的思想,來快速求出。當然這只是解法的一種。

下面我們看下,從無序陣列,如何查詢第k小的值,也就是按照上面第四種思路,實現的**如下:

public class kthsmallest}//基準歸位a[left]=a[i];

a[i]=pivot;

return i;

}

public static int findkthsmall(int a, int left, int right , int k)

//返回基準點的下標,從0開始

int pivotindex = quicksortfindraidx(a, left, right);

//包含基準點在內的左邊的數字個數

int leftnumcount = pivotindex + 1;

//說明當前基準下標的值就是我們要找的

if (leftnumcount == k)

//說明要找的數,在基準點的左邊,繼續在左邊部分遞迴查詢

if (leftnumcount > k) else

}

public static void main(string args) ;

int kthmin = findkthsmall(arr,0,arr.length-1,1);

system.out.println(kthmin);

}

}

無序陣列的中位數

題目 求出乙個無需陣列的中位數。例 的中位數為5,的中位數為4和5。要求 不能使用排序。思路1 將資料平均分配到最大堆和最小堆中,並且保證最小堆中的資料存放的資料都比最大堆中是資料大,那麼此時最小堆堆頂的元素一定是中位數。那麼如何保證最小堆中的元素,都比大堆中的元素大 1 遍歷陣列,將第i個數插入堆...

無序陣列求中位數

長度為 n 的無序陣列,求中位數,如何盡快的估算出中位數,演算法複雜度是多少?如果陣列中元素有奇數個,可以採用這種演算法 步驟 1 可以將陣列的前 n 1 2 個元素,建立 1 個最小堆 步驟 2 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...

無序陣列的中位數

參考 中位數,就是陣列排序後處於陣列最中間的那個元素。說來有些麻煩,如果陣列長度是奇數,最中間就是位置為 n 1 2的那個元素。如果是偶數呢,標準的定義是位置為n 2和位置為n 2 1的兩個元素的和除以2的結果,有些複雜。為了解答的方便,我們假設陣列長度暫且都為奇數吧。面試時,大家是不是經常被問到,...