時間複雜度: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 ...