1、演算法流程
(1)對原始資料構建大根堆:
a、從下至上,遍歷每個非葉子父節點,保證每個非葉子父節點都比它的左右子節點來的大,
非葉子父節點的對應索引範圍為
[0,n/2-1];
b、在遍歷每個非葉子父節點的時候,如果發生該節點交換(下沉)
,那麼要遞迴下去
(2)交換大根堆構建後的陣列的首個元素與末尾元素,這時候陣列的末尾數值最大,
排除該元素排序
。(3)
接著因為這個堆,就相當於堆頂元素被替換成了新的元素,其他元素都是不變的,因此接著只需要從堆頂開始做下沉操作,從新構架最大堆(
不需要遍歷調整所有的非葉子節點)。
2、**實現
//堆排序,對於每個非葉子節點,如果比葉子節點小,那麼就要下沉遞迴該數值
void min_sink(int*data,int node,int length)
{ if (node>=(length/2))
return;
int sink_flag= false;
int min_index=node;
int min_data=data[node];
for(int i=1;i<=2;i++)
{if (min_data=0;i--)//遍歷每個非葉子節點,構建大根堆
min_sink(data,i,length);
for(int count=1;count
資料結構經典演算法之五 堆排序
堆排序基本思想 減治演算法。通過堆來選擇資料,其中排公升序建大堆,排降序建小堆 首先,在這裡簡單介紹一下二叉堆的概念 二叉堆在邏輯上可視為完全二叉樹,在物理上可視為陣列,本質上是對於任意乙個結點,要求根的值 針對大堆 所有的子樹結點的值,其基本作用是找最值 堆排序主要分為以下三部分 1.向下調整 2...
堆(資料結構)及堆排序
這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...
資料結構 堆以及堆排序
堆可以看作是一棵完全二叉樹,除最後一層外,每一層都是填滿的,最後一層從左到右依次填入 在堆上,對任意乙個結點來說,越接近頂部,權值就越大 一般指大頂堆 並且它的權值大於等於它所在子樹所有點的權值 我們把根結點權值大於等於樹中結點權值的稱為大根堆,小於等於樹種結點權值的稱為小根堆 下圖就是乙個大根堆的...