堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間復 雜度均為o(nlogn),它也是不穩定排序。
堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆,反之則為小頂堆,注意 : 沒有 要求結點的左孩子的值和右孩子的值的大小關係。
一般公升序採用大頂堆,降序採用小頂堆
將待排序序列構造成乙個大頂堆,此時整個序列的最大值就是大頂堆的根節點
將根節點與最後乙個葉子結點互換,也就是將最大值與末尾元素互換,此時末尾元素就位最大值。
將除末尾元素外的n-1個元素重新構造成乙個大頂堆,然後重複123,最後就能實現全部有序了。
給定乙個原始陣列【4,6,8,5,9】
步驟一:構造初始堆。將給定無序序列構造成乙個大頂堆
1.此時我們從最後乙個非葉子結點開始(葉結點自然不用調整,第乙個非葉子結點arr.length/2-1=5/2-1=1,也就是下面的 6 結點),從左至右,從下至上進行調整
2.找到第二個非葉節點 4,由於[4,9,8]中 9 元素最大,4 和 9 交換。
3.這時,交換導致了子根[4,5,6]結構混亂,繼續調整,[4,5,6]中 6 最大,交換 4 和 6。
此時,我們就將乙個無序序列構造成了乙個大頂堆。
步驟二:將堆頂元素與末尾元素進行交換,使末尾元素最大。然後繼續調整堆,再將堆頂元素與末尾元素交換得到第二大元素。如此反覆進行交換、重建、交換。
1.將堆頂元素 9 和末尾元素 4 進行交換
2.重新調整結構,使其繼續滿足堆定義
3.再將堆頂元素 8 與末尾元素 5 進行交換,得到第二大元素 8.
4.後續過程,繼續進行調整,交換,如此反覆進行,最終使得整個序列有序
以上就是相關**,接下來話不多說上**
package com.structure.demo;
public
class
heapsort
;heapsort
(ints)
;for
(int i =
0; i < ints.length; i++)}
public
static
void
heapsort
(int
arr)
//2.將最大堆的頭結點與最後乙個葉子結點互換,然後將其餘部分再轉化為最大堆
for(
int i = arr.length-
1; i >
0; i--)}
public
static
void
adjustheap
(int
arr,
int i,
int length)
if(arr[j]
>temp)
else
}//在最後將頭結點的值賦給當前i指向的元素
arr[i]
=temp;
}}
排序演算法 堆排序
1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...
排序演算法 堆排序
花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...
排序演算法 堆排序
由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的 即為堆排序的 主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。include include using namespace...