堆排序:是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法,它是選擇排序的一種。
堆的定義:乙個完全二叉樹中,任意父結點總是大於或等於(小於或等於)任何乙個子節點,則為大頂堆(小頂堆)。完全二叉樹適合採用順序儲存的方式,因此乙個陣列可以看成乙個完全二叉樹。
先將初始檔案r[n]建立成乙個大頂堆(小頂堆),這個堆是初始的無序區。
再將關鍵字最大(最小)的堆頂r[1]與無序區的最後乙個記錄r[n]交換,得到新的無序區r[1….n]和有序區r[n],且r[1..n-2].keys≤r[n-1..n].keys
由於交換後新的根r[1]可能違反堆性質,故應將當前無序區r[1..n-1]調整為堆。然後再次將r[1..n-1]中關鍵字最大的記錄r[1]和該區間的最後乙個記錄r[n-1]交換,由此得到新的無序區r[1..n-2]和有序區r[n-1..n],且仍滿足關係r[1..n-2].keys≤r[n-1..n].keys,同樣要將r[1..n-2]調整為堆。
建堆調整堆
堆排序
我理解為迴圈建堆的過程,每建一次堆就找出最大(最小)的乙個值放在最後乙個元素,交換堆頂與最後乙個元素,交換之後不 滿足堆的規則就繼續建堆。所以只需做n-1趟排序,選出較大的n-1個關鍵字就可以得到有序的數列。
public
class heapsort ;
int arraylength = a.length;
// 迴圈建堆
for (int i = 0; i < arraylength - 1; i++)
}// 對data陣列從0到lastindex建大頂堆
public
static
void
buildmaxheap(int data, int lastindex)
}// 如果k節點的值小於其較大的子節點的值
if (data[k] < data[biggerindex]) else }}
}// 交換
堆排序優於簡單選擇排序(原因:直接選擇排序中,為了從r[1..n]中選出關鍵字最小的記錄,必須進行n-1次比較,然後在r[2..n]中選出關鍵字最小的記錄,又需要做n-2次比較。事實上,後面的n-2次比較中,有許多比較可能在前面的n-1次比較中已經做過,但由於前一趟排序時未保留這些比較結果,所以後一趟排序時又重複執行了這些比較操作。)
堆排序的最壞時間複雜度為o(nlogn)。堆序的平均效能較接近於最壞效能。由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。
它是不穩定的排序方法
堆排序是就地排序,輔助空間為o(1)
排序演算法 (四)堆排序
對簡單選擇排序的優化。1 將序列構建成大頂堆。2 將根節點與最後乙個節點交換,然後斷開最後乙個節點。3 重複第 一 二步,直到所有節點斷開。堆排序模擬流程圖 public class heapsort 對data陣列從0到lastindex建大頂堆 private static void build...
swift演算法之排序 (四)堆排序
1 概述 堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹,並同時滿足堆積的性質 子節點的鍵值或索引總是大於 小於它的父結點。堆又分為 大頂堆 和小頂堆,大頂堆的特點是 該完全二叉樹的根節點比其左右節點都要大,小頂堆的特點是 在小頂堆中根節點比左右子節點的值都要小。1 大頂...
八大排序(四) 堆排序
堆是具有以下性質的完全二叉樹 每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆 每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆 如下圖所示 對堆中的結點按層進行編號,將這種邏輯結構對映到陣列中就是下面這個樣子 以上陣列從邏輯上講就是乙個堆結構,用簡單的公式來描述一下堆的定義就是 大頂堆...