過程描述:從下往上,層層選拔當前人字結構的大值當爸爸
為啥要建堆!!!
如0的第
二、三點說的,建堆完成後,得到了:
1)最值(n個數中的)
2)大根樹結構
然後呢???
1)有了最值就得到了排序結果的第乙個值,距離成功進了一步
2)大根樹的嚴密結構為革命的勝利奠定了基礎!【這裡連線到02調整的第1點】
過程描述:最值和陣列最後一位交換位置,從上往下選爸爸(這個最後一位基本又被踢下去了)
交換是???
根在第一位,作為被已經選出來的這一位,改放在尾部可以更好的管理剩餘的,需要排序的n-1個元素,也節約了位置,實現了原地排序。
為啥有第二步調整堆,直接每次對換後重複建堆,不是都可以得到乙個最值嗎?
我們可以大致看到,相比需要用for遍歷2次的一些其他演算法,本演算法除了第一次興師動眾全部比較了一次後,調換僅僅導致了根結構的區域性變動,所以不需要再次建堆那麼麻煩,調整堆更加輕鬆簡單!
結語:堆排序記減記:
堆排序演算法 C語言
本次排序結果為非遞減,採用的是大頂堆。假設輸出堆頂元素之後,以堆中最後乙個元素替代之,此時根節點的左右值比較,由於左子樹根節點的值大於右子樹的根節點的值且大於根節點的值,則將27和97交換,由於97替代了27之後破壞了右子樹的堆,則需要進行上述相同的調整,直至葉子節點,此時堆頂為n 1個元素中的最大...
c語言堆排序
再看資料結構書的時候,發現堆排序以前根本不懂,以前理解的不是很深刻,對演算法也是一知半解,萬一找工作碰到這樣的筆試題或者面試題,豈不是over了!先梳理一下堆排序的知識吧 堆排序只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。1 堆是完全二叉樹,但不一定是滿二叉樹 2 因為堆不滿足...
堆排序(c語言)
堆排序的基本思想是 將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n 1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了 構建初始堆 公升序建大堆,降序建小堆 a.給定乙個無序陣列 ...