小白高階之堆排序

2021-07-13 17:18:19 字數 1253 閱讀 4484

堆排序與歸併排序一樣,但不同於插入排序的是堆排序的時間複雜度為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 是指利用堆這種資料結構所設計的一種排序演算法。二叉堆本質上是一種完全二叉樹,它分為兩個型別 最大堆和最小堆。最大堆任何乙個父節點的值,都大於等於它左右孩子節點的值。最小堆任何乙個父節點的值,都小於等於它左右孩子節點的值。二叉堆的根節點叫做堆頂。最大堆和最小堆的特點,決定了在...