我同學大龍給我出了一道演算法題:給定乙個長度為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...