堆排序演算法思想非常簡單,先把乙個陣列看成乙個heap, 在下面的實現中,我使用的是max heap, 也就是說根總是比葉子大。所以我們第一步就是建立max heap。建立完畢以後,很明顯這個heap的root就是最大的,把最大的根放在陣列的最後乙個位置,把陣列長度縮小乙個位置,這樣最大的那個數就不會再參與到下次的排序當中,這時,除了根以外,heap的其它部分都保持max heap的特性,所以我們需要再做一次max heap (只對根做),再把最大的放在目前被縮小的陣列的最後乙個位置,重複下去,知道陣列中只剩下乙個數。
class heapsortalgorithm
for (int i = array.length - 1; i > 0; i--)
}/// maxheapify is to build the max heap from the 'position'
public void maxheapify(int array, int position, int heapsize)
if (right < heapsize && array[right] > array[maxposition])
if (position != maxposition)
}/// return the left child position
public int left(int i)
/// return the right child position
public int right(int i)
}
maxheapify的時間複雜度為 o(lgn), 所以整個heap sort的複雜度為:o(n lgn).
堆排序 Heap Sort 演算法(C C)
堆排序演算法基於選擇排序的思想,利用堆結構和二叉樹的一些性質來完成資料的排序。對堆中的結點按層進行編號,將其對映到陣列中會有以下特點 小頂堆 每個結點的值都小於或等於其左右子結點的值。a i a 2 i 1 a i a 2 i 2 大頂堆 每個結點的值都大於或等於其左右子結點的值。a i a 2 i...
經典排序演算法 堆排序Heap sort
經典排序演算法 堆排序heap sort 堆排序有點小複雜,分成三塊 第一塊,什麼是堆,什麼是最大堆 第二塊,怎麼將堆調整為最大堆,這部分是重點 第三塊,堆排序介紹 第一塊,什麼是堆,什麼是最大堆 什麼是堆 這裡的堆 二叉堆 指得不是堆疊的那個堆,而是一種資料結構。堆可以視為一棵完全的二叉樹,完全二...
經典排序演算法 堆排序(Heap Sort)
首先堆是乙個完全二叉樹,但同時他具有這樣的要求 每乙個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆 每乙個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。如下圖是乙個大頂堆 在此要補充乙個二叉樹的性質 二叉樹的某個節點下標為i,則它的左孩子的下標一定為2i,右孩子下標一定為2i 1。假如現...