堆排序與歸併排序一樣,但不同於插入排序的是堆排序的時間複雜度為o(nlgn)。而與插入排序相同,但不同於歸併排序的是堆排序同樣具有空間原址性:任何時候都只需要常數個額外的元素空間儲存臨時資料。堆分為最大堆和最小堆。
最大堆性質是指除了跟以外的所有結點i都滿足:a[parent(i)]>=a[i];
最小堆性質是指除了跟以外的所有結點都滿足:a[parent(i)]<=a[i]。
此處堆排序使用的是最大堆。最小堆比較適合構造優先佇列。
下面是**:
「heapsort.h」
#include#includeint parent(int i);//得到父結點
int left(int i);//得到左孩子下標
int right(int i);//得到右孩子下標
void maxheapify(int *a,int n,int i);//維護堆性質:給定乙個陣列a和乙個下標i,假定i的左右子樹都是最大堆,通過讓a[i]值在最大堆中逐級下降,
//從而使以i為根節點的子樹重新遵循最大堆的性質
void buildmaxheap(int *a,int n);//建堆
void heapsort(int *a,int n);//堆排序
"heapsort.cpp"
#include"heapsort.h"
int parent(int i)
int left(int i)
int right(int i)
void maxheapify(int *a,int n,int i)
}void buildmaxheap(int *a,int n)
for(i=0;i0;i--)
}
"main.cpp"
#include"heapsort.h"
int main(){
int *a,n,i;
printf("please input the number of array:\n");
scanf("%d",&n);
a=(int *)malloc(sizeof(int)*n);
printf("please input the array:\n");
for(i=0;i
原因是c語言中陣列是從0開始的,而建堆的偽碼是從1開始的。0的左右子樹經過計算分別是0和1,這就導致了錯誤。
我做的修改就是在呼叫函式時,對實參做一些修改,加1或者減1,這樣建的堆就是正確的啦~
高階排序之堆排序
概念補充 二叉樹 是n個結點的有限集合,該集合或為空 空二叉樹 或者由乙個根節點和兩顆互不相交的 分別稱為根節點的左子樹和 右子樹的二叉樹組成 完全二叉樹 以上是完全二叉樹,具有n個節點的二叉樹按層序遍歷,如果i的節點與同樣深度的滿二叉樹編號為i的節點位置 完全相同,則這個二叉樹為完全二叉樹 性質5...
常見演算法之排序(高階部分) 堆排序 04
package junior.day 01 public class code 01 sort for int i 0 i len i 格式化輸出陣列 system.out.printf 02d 4d n i,arr i heapsort arr for int i 0 i len i 格式化輸出陣...
堆排序(Heapsort) 高階排序演算法
堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。二叉堆本質上是一種完全二叉樹,它分為兩個型別 最大堆和最小堆。最大堆任何乙個父節點的值,都大於等於它左右孩子節點的值。最小堆任何乙個父節點的值,都小於等於它左右孩子節點的值。二叉堆的根節點叫做堆頂。最大堆和最小堆的特點,決定了在...