二、堆排序
三、優先順序佇列
四、參考資料
堆排序 用**來實現優先順序佇列
二叉堆本質上是一棵完全二叉樹, 分為最大堆和最小堆兩種; 二叉堆的根節點叫做堆頂。
二叉堆本質雖然是完全二叉樹, 但是底層沒有使用鍊錶(鏈式儲存)實現, 而是使用陣列(順序儲存)實現。根據二叉樹的性質, 假設父節點的索引為i, 則左孩子所以為2i+1, 右孩子索引為2i+2。
任意乙個父節點的值大於等於左右子節點的值。
任意乙個父節點的值小於等於左右子節點的值。
構建二叉堆, 需要依靠二叉樹的自我調整, 對於二叉堆, 主要有插入節點、刪除節點、構建二叉堆幾種操作。以最小堆為例, 下面詳細介紹一下上述三種操作。
先將節點插入到二叉樹的最後乙個位置, 和其父節點比較, 如果小於父節點, 則進行交換, 迭代進行到大於等於父節點時結束。
/**
* 最小堆 上浮調整
* @param arr 待調整的堆
*/public
static
void
upadjust
(int
arr)
arr[childindex]
= temp;
}
二叉堆的節點刪除過程和插入過程相反, 所刪除的是處於堆頂的節點, 為了維持堆的結構, 將最後的節點補到原堆頂的位置, 新堆頂的節點和它的左右孩子節點比較, 如果左右孩子都比新堆頂小, 則選小的和堆頂交換, 迭代進行下沉, 直到小於左右孩子為止。
/**
* 最小堆 下沉操作
* @param arr 待調整的堆
* @param parentindex 要下沉的父節點
* @param length 堆的有效大小
*/public
static
void
downadjust
(int
arr,
int parentindex,
int length)
if(temp <= arr[childindex]
) arr[parentindex]
= arr[childindex]
; parentindex = childindex;
childindex = parentindex *2+
1;} arr[parentindex]
= temp;
}
構建二叉堆, 也就是把乙個無序的完全二叉樹調整為二叉堆, 本質上是讓所有非葉子節點依次下沉。從最後乙個非葉子節點開始。
/**
* 構建最小堆
* * @param arr 待調整的堆
*/public
static
void
buildheap
(int
arr)
}
根據二叉堆的性質, 堆排序可以分為兩步:
將無序陣列構建成二叉堆。
迴圈刪除堆頂元素,移到集合尾部(交換位置),調節堆產生新的堆頂。所以從小到大排序應該構建最大堆。
public
class
heapsort
if(temp > arr[childindex]
) arr[parentindex]
= arr[childindex]
; parentindex = childindex;
childindex = parentindex *2+
1;} arr[parentindex]
= temp;
}public
static
void
heapsort
(int
arr)
system.out.
println
(arrays.
tostring
(arr));
// 迴圈刪除堆頂元素, 移到集合尾部, 調節堆產生新的堆頂
for(
int i = arr.length -
1; i >
0; i--)}
public
static
void
main
(string[
] args)
;heapsort
(arr)
; system.out.
println
(arrays.
tostring
(arr));
}}
堆排序都是原來的基礎上進行, 沒有開闢額外的空間, 所以空間複雜度為o(1)。
下沉調整是基礎, 假設有n個元素, 最壞時間複雜度等於二叉樹的高度, 為 o(logn)。
把無序陣列構建成二叉堆, 要進行 n/2 次下沉操作, 時間複雜度 o(nlogn);
迴圈刪除堆頂構建新的二叉堆, 進行 n-1 次迴圈, 每次執行下沉操作, 時間複雜度 o(nlogn)。
上述兩步操作是並列關係, 所以時間複雜度是 o(nlogn)。
《小灰的漫畫演算法之旅》
優先佇列 二叉堆,堆排序
2.4 優先佇列 二叉堆 簡介 可以刪除最大元素和插入元素 特點 高效 對數級別的 刪除最大元素和插入元素操作 public class priorityheap public priorityheap int initsize 獲取最小的元素 public int min 刪除最小的元素 publ...
資料結構 堆,堆實現優先順序佇列,堆排序
堆是一種資料結構,底層是一種陣列物件,它可以被視為一棵完全二叉樹結構 最大堆 每個父節點的都大於孩子節點 最小堆 每個父節點的都小於孩子節點。如圖所示是個大堆,只能保證父節點比孩子節點大。所以下標為0是整個堆最大的,但無法確定下標為1,2的資料哪個更大 思想 從第乙個非孩子節點的下標開始向下調整,保...
二叉堆 堆排序
堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆...