數據結構—堆排序及其應用(優先級隊列)

一、時間複雜度
O(nlgn),原地排序算法(需要的額外存儲空間爲常數);

二、堆
1.堆的性質
(1)大頂堆:除了根節點之外的每個節點滿足:A[parent(i)]>=A[i](最大元素在根節點)
(2)小頂堆:除了根節點之外的每個節點滿足:A[parent(i)]<=A[i](最小元素在根節點)

2.堆排序基本過程
(1)MAX-HEAPIFY
  • 輸入數組A和下標i,設LEFT(i)和RIGHT(i)均爲大頂堆,調整A[i],使其成爲大頂堆;
  • 時間複雜度爲O(lgn),高度爲n的節點的運行時間複雜度爲O(h)
(2)BUILD-MAX-HEAP
  • 自底向上調用MAX-HEAPIFY建立最大堆,由於[n/2+1,n]元素均爲葉子節點,因此只需要調整[n/2,0]元素;
  • 時間複雜度爲O(n)
(3)HEAPSORT
  • 一次調用BUILD-MAX-HEAP,n-1次調用MAX-HEAPIFY(A, 1)(注:heap_size是不斷遞減的)
  • 時間複雜度爲O(nlgn)
3.優先級隊列操作(堆可以在O(lgn)時間複雜度上支持大小爲n集合上的任意優先級隊列操作)
優先級隊列是一種用來維護由一組元素構成的集合S的數據結構,這一組元素中的每一個都有一個關鍵字key,最大優先級隊列支持的操作如下:
(1)MAX-HEAP-INSERT(S,x)
  • 將元素x插入到集合S;
  • ①加入一個關鍵字值爲負無窮大的葉節點來擴充最大堆;②調用HEAP-INCREASE-KEY來設置新節點關鍵字的正確值,並保持最大堆性質;
  • 時間複雜度爲O(lgn)
(2)HEAP-EXTRACT-MAX(S)
  • 去掉並返回S中具有最大關鍵字的元素
  • 時間複雜度爲O(lgn)
(3)HEAP-INCREASE-KEY(S,x,k)
  • 將元素x的關鍵字的值增加到k,這裏k值不能小於x的原關鍵字的值;
  • A[i]不斷和A[parent(i)]比較、交換,直到A[i]<=A[parent(i)]
  • 時間複雜度爲O(lgn)
(4)HEAP-MAXIMUM(S)
  • 返回S中具有最大關鍵字的元素;return S[1];
  • 時間複雜度爲O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章