堆排序的思想是利用數據結構--堆。具體的實現細節:
1. 構建一個最大堆。對於給定的包含有n個元素的數組A[n],構建一個最大堆(最大堆的特性是,某個節點的值最多和其父節點的值同樣大。這樣,堆中的最大元 素存放在根節點中;而且,在以某一個節點爲根的子樹中,各節點的值都不大於該子樹根節點的值)。從最底下的子樹開始,調整這個堆結構,使其知足最大堆的特 性。當爲了知足最大堆特性時,堆結構發生變化,此時遞歸調整對應的子樹。
2. 堆排序算法,每次取出該最大堆的根節點(由於根節點是最大的),同時,取最末尾的葉子節點來做爲根節點,今後根節點開始調整堆,使其知足最大堆的特性。
3. 重複上一步操做,直到堆的大小由n個元素降到2個。
4. gif 演示:http://upload.wikimedia.org/wikipedia/commons/4/4d/Heapsort-example.gif (來自wikipedia)
算法
- public class HeapSort {
-
- public static void sort(Comparable[] data) {
-
- buildMaxHeap(data);
-
- for (int i = data.length; i > 1; i--) {
- Comparable tmp = data[0];
- data[0] = data[i - 1];
- data[i - 1] = tmp;
-
-
- maxHeapify(data, 1, i - 1);
- }
- }
-
-
- private static void buildMaxHeap(Comparable[] data) {
- for (int i = data.length / 2; i > 0; i--) {
- maxHeapify(data, i, data.length);
- }
- }
-
-
- private static void maxHeapify(Comparable[] data, int parentNodeIndex, int heapSize) {
-
- int leftChildNodeIndex = parentNodeIndex * 2;
-
- int rightChildNodeIndex = parentNodeIndex * 2 + 1;
-
- int largestNodeIndex = parentNodeIndex;
-
-
- if (leftChildNodeIndex <= heapSize && data[leftChildNodeIndex - 1].compareTo(data[parentNodeIndex - 1]) > 0) {
- largestNodeIndex = leftChildNodeIndex;
- }
-
-
- if (rightChildNodeIndex <= heapSize && data[rightChildNodeIndex - 1].compareTo(data[largestNodeIndex - 1]) > 0) {
- largestNodeIndex = rightChildNodeIndex;
- }
-
-
- if (largestNodeIndex != parentNodeIndex) {
- Comparable tmp = data[parentNodeIndex - 1];
- data[parentNodeIndex - 1] = data[largestNodeIndex - 1];
- data[largestNodeIndex - 1] = tmp;
-
-
- maxHeapify(data, largestNodeIndex, heapSize);
- }
- }
-
- }