演算法導論 堆排序 堆實現的優先佇列

2021-07-22 16:50:25 字數 1362 閱讀 3213

時間複雜度:o(nlgn)

空間複雜度:具有空間原址性,即o(n)

表示堆的陣列包括兩個屬性:length是陣列的長度,heap_size是堆的大小,某些操作要求某些資料不在堆中

把陣列建成乙個最大堆,就能利用堆實現最大優先佇列了

#include

using namespace std;

#define parent(i) (i/2)

#define left(i) (i*2)

#define right(i) (i*2+1)

#define len(a) sizeof(a)/sizeof(a[0])

#define inf 0x3f3f3f

const

int maxn = 100;

int heap_size;

int length;

int a[maxn];

//堆排序

void max_heapify(int a,int i);//維護乙個最大堆

void build_max_heap(int a); //建立堆

void heapsort(int a); //排序

//優先佇列

void heap_maximum(int a); //返回最大關鍵字元素

int heap_extract_max(int a); //返回最大關鍵字元素並從對佇列中刪除

void heap_increase_key(int a,int i,int key); //把某節點值增加到key

void max_heap_insert(int a,int key); //把key值插入到佇列中

int main();

length = len(a);

heapsort(a);

for(int i=0;i" ";

}}void max_heapify(int a,int i)else

if(r<=heap_size&&a[r]>a[largest])

largest = r;

if(largest!=i)

}void build_max_heap(int a)

}void heapsort(int a)

}void heap_maximum(int a)

int heap_extract_max(int a)

int heap_increase_key(int a,int i,int key)

}void max_heap_insert(int a,int key)

演算法導論 堆排序 優先佇列

二叉堆是乙個陣列,可以被看做乙個近似的完全二叉樹。性質 建堆 可以使用自底向上的方法利用過程maxheapify 向下調整堆 把陣列a 1 n 轉換為堆。偽 向下調整堆maxheapify 偽 演算法描述 3.向上調整堆 向上調整堆 private void adjustup int a,int i...

演算法導論 堆排序實現

我建立了乙個heap的資料結構,而不是像stl那樣使用函式解決堆排序,當然stl的比較優雅一點,我只是提供第二個思路 ifndef heap sort h define heap sort h include include include ifdef debug include endif deb...

演算法導論堆排序實現

部分有序使用堆排序效率較高,基本有序使用插入排序或氣泡排序效率較高 include include 調整函式要求除了要調整的點,都要滿足堆的性質 void maxheapify int a,int i,int length else 取父節點 左右節點最大值 if right length 1 a ...