1. 程式人生 > 實用技巧 >JVM 07 本地方法介面

JVM 07 本地方法介面

本文參考 https://www.cnblogs.com/chengxiao/p/6129630.html 感謝大佬精心繪圖!

主要思想:

​ 1、將無需序列構建成一個堆,根據升序降序需求選擇大頂堆或小頂堆

​ 2、將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端,同時接著重新調整堆的結構

​ 3、繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序

每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆

該陣列從邏輯上講就是一個堆結構,我們用簡單的公式來描述一下堆的定義就是:

大頂堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]

小頂堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

二叉樹相關知識:

第一個非葉子節點 m = arr.length / 2 -1

第一個非葉子節點的左孩子節點 n = 2 * m + 1

package com.jason.sort;

/**
 * @Authot CodeDuck
 * @Date 2020/7/17-13:20
 */
public class HeapSort {

    public static void main(String[] args) {
        int[] arr = {11, 7, 18, 3, 5, 4, 10, 9};
        sort(arr);
        for (int a : arr) {
            System.out.println(a);
            ;
        }
    }

    /**
     * @Description: 堆排序
     * @Param: arr陣列
     * @return: void
     */
    public static void sort(int[] arr) {

        // 1、構建大頂堆
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            // 從第一個非葉子結點從下至上,從右至左調整結構
            adjustHeap(arr, i, arr.length);
        }

        // 2、調整堆結構+交換堆頂元素與末尾元素
        for (int i = arr.length - 1; i > 0; i--) {
            swap(arr, 0, i);
            adjustHeap(arr, 0, i);
        }
    }

    /**
     * @Description: 調整為大頂堆
     * @Param: arr陣列
     * @Param: i 所要調整的節點
     * @Param: length:陣列長度
     * @return: void
     */
    public static void adjustHeap(int[] arr, int i, int length) {

        int temp = arr[i]; // 獲取當前交換的節點val
        for (int k = 2 * i + 1; k < length; k = 2 * k + 1) { // 獲取當前節點的左孩子節點

            // 若左孩子節點小於右孩子節點,k指向右孩子節點
            if (k + 1 < length && arr[k] < arr[k + 1]) { 
                k++;
            }

            if (arr[k] > temp) {  // 如果當前孩子節點大於父節點
                arr[i] = arr[k];  // 將父節點的值 賦值於 被交換孩子節點
                i = k;            // 將 i 指向被交換孩子節點
            } else {
                break;
            }
        }
        arr[i] = temp; // 將temp賦值於被交換孩子節點
    }


    /**
     * @Description: 交換元素
     * @Param: arr 元素組
     * @Param: i,j陣列下標
     * @return: void
     */
    public static void swap(int[] arr, int i, int j) {

        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}