排序之堆排序

2021-09-25 10:31:50 字數 1189 閱讀 9471

利用這種資料結構進行排序的一種演算法,它是選擇排序的一種。

我們可以把堆看成一棵完全二叉樹,這棵完全二叉樹滿足:

大堆:每個節點的值大於等於孩子節點的堆)

小堆:每個節點的值小於等於孩子節點的堆

代表堆的完全二叉樹的根結點的值是最值的,也是陣列的第乙個元素,將乙個無序序列調整為乙個堆,就可以找出這個序列的最值,然後將找出的這個最大值交換到序列的最後(或最前),這樣有序序列關鍵字增加1個,無序序列關鍵字減少1個,對新的無序序列重複這樣的操作,就實現了排序。

注意:堆排序中最關鍵的操作是將序列調整為堆,整個排序的過程就是通過不斷調整,使得不符合堆定義的完全二叉樹變為符合堆定義的完全二叉樹。

堆的儲存結構:

記憶體結構:

**實現:

//堆化

void

heapify

(int a,

int size,

int index)

max = a[left]

>= a[right]

? left : right;

if(a[index]

>= a[max]

)else

}

//建堆

intcreatheap

(int a,

int size)

}void

heapsort

(int a,

int size)

}

堆排序的特性總結:堆排序使用堆來選數,效率就高了很多時間複雜度:o(n*logn)

空間複雜度:o(1)

穩定性:不穩定

排序之堆排序

堆排序是一種基於比較排序的另一種排序演算法,它採用了一種近似完全二叉樹的二叉堆資料結構。演算法實現相容了插入排序的空間原址性 即只需要有限個額外的儲存空間 和歸併排序的優良時間複雜度。偽 如下 heapsort a build max heap a for i a.length downto 2 e...

排序之堆排序

這裡沒有對0號元素進行排序 堆排 public class heap public static void exec comparable array,int i,int j 下沉 private static void sink comparable array,int k,int n publi...

排序之堆排序

堆其實是一種完全二叉樹,從上到下從左到右,大頂堆的父節點大於其左右子節點,小頂堆的父節點小於其左右子節點 1 首先是進行heapify,建立堆 2 從下到上,從右到左的進行heapify構建有序的堆 3 進行排序,將堆頂父節點和底層最右邊的子節點互換,然後不斷重複以上步驟 1 heapify def...