堆排序,首先要對堆的性質有了解,分大頂堆和小頂堆,我這次寫的是大頂堆,即父節點大於其子節點,在把堆無序後,從堆頂開始遍歷,得到大堆頂,把堆頂與最後乙個元素對換,這時,最後乙個元素就是最大值,這時,就不用考慮最後乙個元素了,開始迴圈。重新開始從頭遍歷,詳細過程寫在**裡,大家參考: :
/*此排序主要有2個難點,第乙個是初始化無序堆,第二個是交換元素形成有序堆
寫的是大頂堆
1.首先要從下三角開始遍歷,一層層的往前推,推到a[0],此時的a[0]是最大值。這時,此堆已經初始成功
2.a[0]即為最大頂,把a[0]與最後乙個元素a[len-1]交換,就不用考慮最後乙個值了,但是這時的堆已經不符合
性質了。
3.因此開始從a[0]往下支路換,換到a[0]為 0--len-1 最大值,交換 a[0]和a[len-2]的值,這時,a[len-2]和a[len-1]
為有序的。
4.不斷迴圈,直到a[1]排好序,a[0]就不用排了。*/
#include//從下三角開始交換得到最大堆
void adjustmaxheap(int a, int len, int parentnodeindex)
//有左節點,沒有右節點
if(rightchildindex>=len)
//有左節點,有右節點
else
//進行比較和互換
if(a[targetindex]>a[parentnodeindex]) }
void initheap(int a, int len)
}int main()
; int len=8;
initheap(a, len);
for(int i=len-1;i>0;i--)
//關鍵語句
adjustmaxheap(a, i,0);
} for(int j=0;j
return 0;
}
二叉樹與堆排序
樹與二叉樹簡介 樹是一種資料結構,比如目錄結構,樹是一種可以遞迴定義的資料結構 樹是由n個節點組成的集合,如果n 0,那麼這是一顆空樹,如果n 0,那存在乙個節點作為樹的根節點,其他節點可以分為m個子樹,每個子樹本身又是一棵樹 一些概念 根節點 葉子節點 a就是根節點,沒有子樹的都是葉子節點,如圖中...
堆排序(完全二叉樹)
堆排序,一種全新的排序方式,運用了完全二叉樹存資料。假設根是u,那麼左兒子就是u 2,右兒子是u 2 1.用一維陣列手擼乙個堆排序。1,如何插入乙個數。heap size x up size 2,求集合中的最小值。heap 1 3,刪除最小值。heap 1 heap size size down 1...
二叉樹,排序二叉樹
說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...