資料結構 堆排序

2021-09-20 14:33:04 字數 1349 閱讀 8612

通過學習優先佇列和二叉堆,我們知道優先佇列中隊首的元素總是最大(最大堆)或者最小(最小堆)的元素,根據這個規律,如果我們把一系列無序的元素插入到優先佇列中,然後再從優先佇列中逐個刪除元素,則刪除元素的順序是有序的。我們由此可以演變得出一種排序演算法--堆排序。

此處以最大堆來討論,堆排序的實現分為2個階段:構造堆階段下沉排序階段

首先實現堆排序中需要的3個基本操作:

排序方法sort實際是對上面3個基本操作的組合,在構造堆階段,通過sink操作構造好二叉堆。在排序階段,通過exch操作將最大的元素排除到堆外,放到陣列最末端,然後通過sink操作使堆重新變得有序。如此往復,直至堆中沒有元素,此時陣列即是有序的。基於最大堆的堆排序是公升序的,反之,基於最小堆的堆排序是降序的。完整**如下:

/**

* 堆排序實現:基於最大堆實現

*/public class heatsort

/*** 交換

*/private static void exch(comparable arr, int i, int j)

/*** 下沉

*/private static void sink(comparable arr, int k, int size)

// 如果當前節點大於子節點,則找到合適位置

if (!less(arr, k, j))

// 如果當前節點小於子節點,則繼續交換下沉

exch(arr, k, j);

k = j;}}

/*** 排序

*/public static void sort(comparable arr)

// 下沉排序

while (size > 1)

}public static void main(string args) ;

sort(arr);

system.out.println(arrays.tostring(arr));}}

從上面**可以看出,堆排序使用待排陣列本身作為堆的儲存結構,不占用額外的空間,因而屬於內部排序。

堆排序的主要工作都是在下沉排序階段完成的,每次從堆中刪除最大的元素,然後放入到堆縮小後空出的空間中。這個過程和選擇排序的過程類似,都是選擇最大/最小的元素放到陣列末尾,但相比於選擇排序,堆排序在查詢最大/最小元素的效率為$o(logn)$,高於選擇排序的$o(n)$,從而提公升了排序效率。

演算法(第4版)2.4節-優先佇列

堆排序示意動畫

資料結構 堆排序 堆排序 Heap Sort

堆排序是一種選擇排序,其時間複雜度為o nlogn 堆的定義 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 其中i 1,2,n 2向下取整 若將和此序列對應的一維陣列 即以一...

資料結構 堆排序

include include void maxheapify int a,int length,int i void buildmaxheapify int a,int length void heapsort int a,int length void main void printf heap...

資料結構 堆排序

1 堆排序的時間複雜度與歸併排序相同,o nlogn 堆排序的優勢在與他只需要固定數量的額外空間,堆排序要比空間複雜性為o n 的歸併排序稍微慢一些,但是比空間複雜性為o 1 的歸併排序要快。2 對序列 26,5,77,1,61,11,59,15,48,19 進行堆排序 過程 調整最大堆 二叉堆 v...