在一組無序陣列中,比如{1,9,8,2,7,3,6,4,5}
將陣列看做是乙個堆
,也可以用二叉樹
來表示
但是這個堆現在還不是大頂堆
,大頂堆的特點是父節點
永遠大於左右子節點
第一步需要將這個堆構建成大頂堆
構建前需要知道的幾點:
/**當無序陣列第一次執行完* 構建大頂堆**
@param
array 原始陣列
* @param
length 需要構建的長度
*/private
static
void buildmaxheap(int array, int
length) }
/*** 調整大頂堆**
@param
array 被調整陣列
* @param
i 非葉子節點
* @param
length 需要調整的長度
*/private
static
void adjustheap(int array, int i, int
length)
//如果子節點》父節點
if (array[j] >temp)
else
//讓大的子節點等於之前非葉子節點的值
array[j] =temp;}}
buildmaxheap
方法後,已經可以確定根節點就是最大值,然後將根節點的值與元素末尾的值交換
然後迴圈這個過程
/**重點看這個地方* 獲取前n個最大的數**
@param
array 原始陣列
* @param
n 前n個
*/public
static
int heapsort(int array, int
n)
int result = new
int[size];
system.arraycopy(array, array.length - size, result, 0, size);
return
result;
}
while (n > 0 && n <=length)交換根節點和陣列末尾元素後,意思就是已經確定最大值,然後將
n
減1,length
減1,n
用來控制構建大頂堆的次數,構建n
次,就能確定前n
個最大值
然後再次構建大頂堆,直到n=0
跳出迴圈
while
迴圈結束,那麼陣列的後n項,已經是排序好了的
假如n=3
那麼結果就是{7,8,9}
假如n=9
那麼結果就是{1,2,3,4,5,6,7,8,9}
,也就是最終堆排序的結果
堆排序查詢前N個最大數和二分查詢演算法
先了解堆排序概念 堆排序利用了大根堆 或小根堆 堆頂記錄的關鍵字最大 或最小 這一特徵,使得在當前無序區中選取最大 或最小 關鍵字的記錄變得簡單。1 用大根堆排序的基本思想 先將初始檔案r 1.n 建成乙個大根堆,此堆為初始的無序區 再將關鍵字最大的記錄r 1 即堆頂 和無序區的最後乙個記錄r n ...
找前n個最大數 生成100個不重複的隨機數
假設有10000個數,需要找到裡面前10個最大數。樸素的解法當然是先排序,然後輸出前10 個數,時間複雜度最低為o logn 思考我們可以維護乙個10個元素大小的容器,用在某種演算法使得這個容器裡面維護的就是我們需要的10個數。先從vector開始思考,用前10和數初始化,然後不斷的遍歷剩餘元素,找...
快速排序以及基於快排思想的找前k個最大數
1 int partition vector v,int head,int rear 7swap v head v rear 8while v head key head 11swap v rear v head 1213 14 v head key 15 my count 16return hea...