在此排序過程中,我並沒有建立乙個真正的二叉堆,而是用乙個陣列來模擬堆,每次把通過回溯找到的最大或最小元素與最後乙個元素交換,最後形成乙個順序的陣列。
首先我們來看一下小元素下移與大孩子上移的演算法,與二叉堆的建立基本相同。
#define leftchild(i) (2*i+1)
void perdown(int a,int i,int n)//建立乙個最大堆的過程,小的元素下移
for(i=n-1;i>0;i--)
}
從所有節點的一半位置處往上建立就可以了,因為葉子節點沒有孩子。每次建完都交換首尾的位置,然後再下移即可,最後形成乙個完整的有序陣列。
總結:堆排序是乙個非常穩定的演算法,對於n個互異的隨機排列的陣列,所用的平均比較次數為2nlogn-o(nloglogn),約為2nlogn-o(n)。
插入排序與堆排序分析
選擇排序對大小為n的無序陣列r n 進行排序,進行n 1輪選擇過程。首先將第1個元素作為已經排序好的子陣列,然後將剩餘的n 1個元素,逐個插入到已經排序好子陣列 因此,在第 i輪排序時,前i個元素總是有序的,將第i 1個元素插入到正確的位置。複製 純文字複製 include include defi...
演算法設計與分析 堆排序
後記乙個高效的排序演算法,對整個計算機領域的貢獻都是極大的。在我看來,堆排序演算法就是這樣一種高效的排序演算法,它本身的設計就是非常巧妙的。等我以後寫了二叉樹分析的部落格再附上我自己的,嘿嘿。一棵父節點元素一定大於等於子節點元素的完全二叉樹 以上不是水字數,只是附上我的理解罷了 如上圖,看第二個,首...
堆排序分析實現
演算法思想 若公升序,建大堆,每次選擇堆頂元素即最大的數,和最後一位交換,再縮小堆的範圍 避免剛排好的最後乙個位置被調回去 對剩下的進行向下調整 此時只有根節點不對,左右子樹都滿足大堆 反覆進行直到堆的範圍為0.則資料就有序了。實現思路 堆排序的實現首先是需要將陣列調整為乙個大堆或者小堆,然後就是迴...