二叉堆 堆排序

2021-06-16 06:54:39 字數 874 閱讀 3887

推薦:

某cppblog

wutianqi'sblog

堆排序實現:

#include using namespace std;

// 輸出當前堆的排序狀況

void printarray(int data, int size)}

// 建堆

// 自底而上地呼叫maxheapify來將乙個陣列a[1..size]變成乙個最大堆

//注意:不能只寫maxheapify(a, 1, size),因為這樣只會對左子樹或右子樹建堆,應該從下至上建堆!

void buildmaxheap(int *a, int size)

// 堆排序

// 初始呼叫buildmaxheap將a[1..size]變成最大堆

// 因為陣列最大元素在a[1],則可以通過將a[1]與a[size]互換達到正確位置

// 現在新的根元素破壞了最大堆的性質,所以呼叫maxheapify調整,

// 使a[1..size-1]成為最大堆,a[1]又是a[1..size-1]中的最大元素,

// 將a[1]與a[size-1]互換達到正確位置。

// 反覆呼叫heapify,使整個數組成從小到大排序。

// 注意: 交換只是破壞了以a[1]為根的二叉樹最大堆性質,它的左右子二叉樹還是具備最大堆性質。

// 這也是為何在buildmaxheap時需要遍歷size/2到1的結點才能構成最大堆,而這裡只需要堆化a[1]即可。

void heapsort(int *a, int size) }

int main()

二叉堆 堆排序

堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆...

優先佇列 二叉堆,堆排序

2.4 優先佇列 二叉堆 簡介 可以刪除最大元素和插入元素 特點 高效 對數級別的 刪除最大元素和插入元素操作 public class priorityheap public priorityheap int initsize 獲取最小的元素 public int min 刪除最小的元素 publ...

資料結構之二叉堆 堆排序

很久以前排序演算法的時間複雜度一直是o n 2 當時學術界充斥著 排序演算法不可能突破o n 2 的聲音,直到1959年,由d.l.shell提出了一種排序演算法,希爾排序 shell sort 才打破了這種不可能的聲音,把排序演算法的時間複雜度提公升到了o n 3 2 當科學家們知道這種 不可能 ...