很認真地看完了《算導》的排序之前的所有部分,除了演算法複雜度那一章的數學要求太高,難以完全駕馭以外,其他的部分還是很好理解的。。。
爭取把《算導》裡面出現的演算法都自己實現,製作自己的模板,以後好用。。。堆排序雖然在一般的時候是沒有快排好用,但是在優先佇列裡面很好用,所以也是很有力的**!
這個堆排序模板是我基本完全按照《演算法導論》裡面自己乙個字乙個字的敲上去的,除錯的時候修改了幾個小地方:1.heapsize,開始我準備寫乙個函式的,但是因為在sort函式裡面要執行自減操作,所以必須要用全域性變數才好處理;2.《算導》裡面是從陣列下標的1開始的,所以我在賦初值的時候將 a[0] 跳過了
#include //堆長度
int heapsize;
//大頂堆化
void max_heapify(int a, int i)
}//建堆
void build_max_heap(int a)
}//堆排序
void heapsort(int a)
}int main()
; //ok
int n = sizeof(a) / sizeof(int) - 1;
heapsize = n;
heapsort(a);
for (int i = 1; i <= n; i++)
printf("%d ", a[i]);
return 0;
}
執行結果為:
1 2 3 4 5 6 7 8 9 10
堆排序 模板 堆排序
biu 堆排序是乙個不穩定的排序演算法,對資料不敏感,時間複雜度穩定,主要分為兩部分 建堆 堆排序。其中建堆的時間複雜度是 o n o n o n 的,而排序選出乙個最大 最小值的過程是 o l ogn o logn o logn 的,一共需要n次操作,故總共的時間複雜度是 o n logn o n...
堆排序模板
最小堆刪除堆頂法排序 include int n 儲存堆中的陣列的個數 int h 101 存放堆的陣列 void swap x,y 交換堆中的兩個元素 void shiftdown int i 第i個位置向下調整 if t i else flag 1 return void creat intde...
堆排序模板
include include using namespace std const int n 1e5 10 int h n n,m,cnt void down int x x是元素在堆中的下標 int main void cnt n 記錄現在堆中所有的元素 for int i n 2 i 0 i ...