HeapSort是利用堆積樹(Heap Tree)的性質來排序,堆積樹為完全二元樹(Complete Binary Tree)的一種,父節點大於兩個子節點稱為最大堆積樹,反之則稱為最小堆積樹

HeapSort原理就是將堆積樹根(最大or小值)與最後一個節點調換,將最後一個節點(原樹根)取出,並加入已排序數列,再將樹調整為堆積樹

最小堆積樹程式步驟:
1.由根或葉走訪二元樹
2.如遇子節點比父節點小時,子節點與父節點交換
3.遞迴繼續往樹根比
4.回到原本二元樹的走訪

HeapSort程式步驟:
1.將二元樹排列成堆積樹
2.根與葉交換,取出葉(原先的根)
3.重新排列堆積樹
4.重複

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Iterator;
public class heapSort {
    private static int [] arr = {0,10,25,15,30,26,20,29,35,40,27,28,22,12};
    private static ArrayList<Integer> result = new ArrayList<Integer>();
    public static void main(String [] argv) {
        HeapSort();
    }

    public static void HeapTree() {
        int len = arr.length - 1;
        int n = 1;
        while (n * 2 <= len) {
            int left = n * 2;
            int right = n * 2 + 1;

            if (arr[left] < arr[n]) {
                swap(left,n);
                BubbleSort(n);
            }

            if (right > len) {
                break;
            }

            if (arr[right] < arr[n]) {
                swap(right,n);
                BubbleSort(n);
            }
            n++;
        }
    }

    public static void BubbleSort(int n) {
        while (n / 2 > 0) {
            if (arr[n] < arr[n / 2]) {
                swap(n,n / 2);
            }
            n /= 2;
        }
    }

    public static void HeapSort() {
        HeapTree();
        int len = arr.length - 1;
        while (len > 0) {
            swap(1,len);
            result.add(arr[len]);
            arr = Arrays.copyOf(arr, len--);
            HeapTree();
        }
        show();
    }

    public static void swap(int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    public static void show() {
        Iterator it = result.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
        System.out.println();
    }
}
Categories: DataStructure