堆排序-JAVA語言實現

import java.util.Arrays;

public class HeapSort {
    public static void main(String[] args) {
        int[] arr = new int[]{5,4,1,9,8,6,3,7,2,0,1};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(arr));
        heapSort(arr);
        System.out.println("排序後:");
        System.out.println(Arrays.toString(arr));
    }

    //堆排序
    public static void heapSort(int[] arr){
        //開始調整的位置爲最後一個葉子節點
        int start = (arr.length - 1)/2;
        //從最後一個葉子節點開始遍歷,調整二叉樹
        for (int i = start; i >= 0 ; i--){
            maxHeap(arr, arr.length, i);
        }

        for (int i = arr.length - 1; i > 0; i--){
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            maxHeap(arr, i, 0);
        }
    }

    //將二叉樹調整爲大頂堆
    public static void maxHeap(int[] arr, int size, int index){
        //建立左子節點
        int leftNode = 2 * index + 1;
        //建立右子節點
        int rightNode = 2 * index + 2;

        int maxNode = index;
        //左子節點的值大於根節點時調整
        if (leftNode < size && arr[leftNode] > arr[maxNode]){
            maxNode = leftNode;
        }
        //右子節點的值大於根節點時調整
        if (rightNode < size && arr[rightNode] > arr[maxNode]){
            maxNode = rightNode;
        }
        if (maxNode != index){
            int temp = arr[maxNode];
            arr[maxNode] = arr[index];
            arr[index] = temp;
            //交換之後可能會破壞原來的結構,需要再次調整
            //遞歸調用進行調整
            maxHeap(arr, size, maxNode);
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章