資料結構與演算法 堆排序

2021-09-21 02:08:02 字數 1130 閱讀 2102

基礎概念:堆排序是利用這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o(nlogn),它也是不穩定排序。

通俗理解

將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了

/**

**堆排序

**date:2023年5月5日

****/

#include // 調整二叉堆

void downadjust(int *a,int parent,int length)

// 如果當前節點大於或等於左右孩子的話,直接退出

if(temp >= a[child])

// 直接覆蓋,無需交換

a[parent] = a[child];

parent = child;

child = 2 * child + 1;

} a[parent] = temp;

}// 堆排序

void heapsort(int *a,int length)

// 2.堆排序

for(i = length - 1; i > 0; i--)

}// 輸出

void show(int *a,int n)

}void main();

int length = sizeof(a) / sizeof(a[0]);

printf("\n排序前:\n");

show(a,length);

// 堆排序

heapsort(a,length);

printf("\n排序後:\n");

show(a,length);

printf("\n");

}

平均時間複雜度: o(nlogn)

空間複雜度: o(1)

資料結構與演算法 堆排序

1 堆的性質 堆是一棵完全二叉樹,除最後一層外每層都是滿的 元素個數為2 i 1 根節點為第1層 最後一層如果不滿則只缺少右邊葉結點。如果按照廣度優先,即從上至下,從左至右對節點編號。根節點序號為0,節點i的父節點是 i 1 2,左子節點是2 i 1。最小堆中任意父節點不能比子節點大,最大堆中任意父...

資料結構與演算法 堆排序

堆排序堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆的性質 即子節點的鍵值或索引總是小於 或者大於 它的父節點,堆排序的時間複雜度為o nlogn 來自維基百科 什麼是堆 堆是一種特殊的完全二叉樹,它的性質為 任意節點大於等於或者小於等於它的左右節點。...

資料結構與演算法 堆排序

目錄堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個節點的值都大於或等於其子節點的值,在堆排序演...