JVM 07 本地方法介面
阿新 • • 發佈:2020-07-17
本文參考 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; } }