堆排序

package sort.choose;

import java.util.Arrays;

/**
 * @author chenyi
 * @Description 二叉樹遍歷
 * @date 2022/2/17 15:30
 */
public class HeapSort {

    public static void main(String[] args) {
        //int arr[] = {4,6,8,5,9};
        int arr[] = {10, 6, 14, 4, 8, 12, 16, -1, 1, 99};
        System.out.println("遍歷順序存儲二叉樹");
        System.out.println(Arrays.toString(arr));
        /*System.out.println("第一次堆排序");
        adjustHeap(arr,arr.length/2-1,arr.length);
        System.out.println(Arrays.toString(arr));
        System.out.println("第二次堆排序");
        adjustHeap(arr,1,arr.length);
        System.out.println(Arrays.toString(arr));
        System.out.println("第三次堆排序");
        adjustHeap(arr,0,arr.length);
        System.out.println(Arrays.toString(arr));*/
        System.out.println("堆排序");
        for (int i = (arr.length >> 1) - 1; i >= 0; i--) {
            adjustHeap(arr, i, arr.length);
        }

        for (int i = arr.length - 1; i > 0; i--) {
            // 把最大的數放到末尾
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            adjustHeap(arr, 0, i);
        }
        System.out.println(Arrays.toString(arr));

    }

    private static void adjustHeap(int[] arr, int i, int length) {
        // 記錄i的值
        int temp = arr[i];
        int max = i;
        // 至少要有一個左節(jié)點吧
        while (max * 2 < length - 1) {
            // 比較樹的左右節(jié)點
            if (arr[2 * i + 1] > arr[max]) {
                max = 2 * i + 1;
            }
            if (2 * i + 2 < length && arr[2 * i + 2] > arr[max]) {
                max = 2 * i + 2;
            }
            if (max == i) {
                break;
            }
            // 交換之后要考慮是否會影響子樹,所以要對變更的節(jié)點進行再次調整
            arr[i] = arr[max];
            arr[max] = temp;
            i = max;
        }
    }


}

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容