**參考博主dreamcatcher-cx
這位博主還有許多優秀的排序方法學習記錄
構建n次最大堆,每次構建頂點元素即為陣列最大元素,找到最大元素之後將最大元素放在陣列最後
從最後乙個非葉子節點開始,將該節點調整最低階節點,也即它的小於父節點大於兩個子節點;調整次數為n/2-1
完成最大堆的構建之後,將堆的頂點與最後乙個元素交換
將頂點調整至最低階節點
陣列的堆擺放是按照完全二叉樹形式,也即從上至下,從左至右
節點i的父節點為(i-1)/2, 左節點為2i+1, 右節點為2i+2
設最後乙個非葉子節點為x,則最後乙個葉子節點(設序號k)為其子節點,若n=k+1為總節點數,要麼是n = 2x+2(最後為左節點),要麼n=2x+3(最後為右節點);
void swap(int a, int b)
}//將i節點調整至最低階
void adjustheap(vector& v, int i, int n)
if (v[k] > cur)
else
break;
} v[curi] = cur;
}void heapsort(vector& v)
//2. 調整堆結構
for (int j = v.size() - 1; j >= 0; j--)
}
堆排序學習
資料來自 靜默虛空 萬分感謝 做筆記用 1 根據初始陣列去構造初始堆 構建乙個完全二叉樹,保證所有的父結點都比它的孩子結點數值大 2 每次交換第乙個和最後乙個元素,輸出最後乙個元素 最大值 然後把剩下元素重新調整為大根堆。設有乙個無序序列 構建初始堆 完整的堆排序處理 如果父結點的值已經大於孩子結點...
堆排序學習筆記
參考此文的學習筆記 不用交換,則已經是最大堆,不用迴圈了 else break void sort int a,int length 開始排序,排序是從上到下從左到右的調整 for int j length 1 j 0 j int main sort a,length for int i 0 i l...
堆排序詳細學習
首先要明白堆是基於二叉樹而言的,堆是二叉樹的一種形式。並且堆是完全二叉樹,具有完全二叉樹的特點。堆只有2種 大頂堆和小頂堆。大頂堆 就是根節點大於子節點,小頂堆反之。下面上圖 一棵完全二叉樹如何才能轉換成乙個堆呢?把握好堆的特點 大頂堆的根永遠大於左右孩子,那麼只需要把每乙個子樹中的左右孩子的較大值...