從無序陣列中獲取最小的M個元素(小頂堆實現)

2021-09-08 14:18:27 字數 1240 閱讀 8536

我同學大龍給我出了一道演算法題:給定乙個長度為n無序的陣列,怎麼從中挑選出最小的m個數(m<=n)?

我的第一想法就是用快速排序將整個陣列進行排序,然後遍歷排序後的陣列,從中選處m個最小的數。雖然這個方法可行,但是不是最好的。

用堆排序的思想就可以很好的解決這個問題。建立小頂堆,然後每次將堆頂最小元素丟擲,迴圈m次即可獲取最小的m個數。

這個演算法題也可以認為是堆排序的乙個應用。

堆排序演算法請看我的另外一篇文章:

具體**如下所示:

//////

從給定的陣列中獲取n(count)個最小的數

//////

傳遞的整形陣列

///獲取count個最小的數

private

static

void

getsmallernumbers(

int array,

intcount)

}///

///建立小根堆

//////

傳遞的陣列

private

static

void

buildminheap(

int array)

}///

///從底向上:調整小根堆的過程

//////

傳遞的陣列

///需要調整的當前根節點

///此時小頂堆的大小(即:處在小頂堆中所有的陣列元素個數)

private

static

void

minheapify(

int array,

intcurrentindex,

intheapsize)

if(rightchildindex

<

heapsize

&&array[rightchildindex]

<

array[smallestindex])

if(smallestindex

!=currentindex)

//左右子節點中存在小於根節點元素的情況

}///

///交換函式

//////

元素a///

元素bprivate

static

void

swap(

refint

a, ref

intb)

從無序陣列中找出第K大的數

該題目的兩種實現方式,第一種是用堆排序 其中陣列用到了二叉樹的性質 第二種是利用快速排序來實現.最大堆進行公升序排序,主要步驟是 1.初始化堆 將數列a 1.n 構造成最大堆。2.交換資料 將a 1 和a n 交換,使a n 是a 1.n 中的最大值 然後將a 1.n 1 重新調整為最大堆。接著,將...

無序陣列中最小的k個數

對於乙個無序陣列,陣列中元素為互不相同的整數,請返回其中最小的k個數,順序與原陣列中元素順序一致。給定乙個整數陣列a及它的大小n,同時給定k,請返回其中最小的k個數。測試樣例 1,2,4,3 4,2返回 1,2 簡單題 coding utf 8 class kthnumbers def findkt...

2 返回無序陣列中連續元素的長度

給定乙個無序陣列,返回連續的元素中最長的長度,比如陣列a 7,6,8,1,2,2,5 返回4,並且要求複雜度為o n 這個時候如果不考慮複雜度,那麼就很好解決了,先排序再求長度,考慮到複雜度,就不能排序了,可以使用雜湊表 來幫助我們完成這個運算,如下 public static int getcon...