時間複雜度為o(nlogn),思路就是從最後乙個非葉結點開始,依次往回遍歷每個結點,將以該結點為根的子樹建立成大根堆,直到遍歷到整棵完全二叉樹的根結點時為止,此時整棵樹為大根堆。
以當前結點為根的子樹建立大根堆:
//向下調整,將該結點的子樹變成大根堆
void adjustdown(int a,int k,int len)
}
這樣排序的結果為由小到大!
如果插入元素的話,直接插入到最後的位置,然後將插入的元素向上調整,直到整棵樹再次變成大根堆時為止!
向上調整的**:
//插入元素到最後位置,需要向上調整建立大根堆
void adjustup(int a,int len)
a[j]=a[0];
}
c 實現堆排序(由小到大)
這裡實現了兩種堆排序演算法 第一種是 將n個元素逐個插入到乙個空堆中,演算法複雜度為o nlogn 第二種是 從第乙個不是葉子節點的元素開始調整堆 演算法複雜度為o n 這裡還將堆排序和三路快排,歸併排序做了乙個比較 結果如下 優化 從第乙個非葉子節點開始 templatevoid heapsort...
堆排序(大根堆)
堆排序是利用堆的性質進行的一種選擇排序。下面先討論一下堆。1.堆堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。...
堆排序 大根堆
include include using namespace std define max 100010 int heap max heap i 的孩子是 2 i 1 2 i 2 父親是 i 1 2 int heapsize 0 初始化堆的大小 void heapinsert int index ...