代码部分:
import java.lang.reflect.Array; import java.util.Arrays; public class HeapSort { //堆排序 public static void heapsort(int[] arr){ if (arr == null || arr.length < 2){ return; } //建立堆 for (int i = 0;i < arr.length; i++){ heapInsert(arr,i); } //排序部分 每次取根节点(最大值) 然后在重新heapify 入此循环,数组即可变成有序 int size = arr.length; swap(arr,0,--size); while (size > 0){ heapify(arr,0 ,size); swap(arr,0,--size); } } //往堆上添加节点并与父节点比较大小 大根堆 大则向上跑 并更新父节点 // 父节点 i //左孩子 2i + 1 右孩子2i+2 public static void heapInsert(int[] arr, int index){ while(arr[index] > arr[(index -1) / 2]){ swap(arr,index,(index -1) / 2 ); index = (index -1) / 2; } } //堆的自适应 某个父节点变小了 自动调节为大小根堆 // @index 父节点位置 // @堆的大小 public static void heapify(int[] arr, int index, int size){ int left = index * 2 + 1; while (left < size) { //找出孩子节点较大的 int largest = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left; //孩子节点较大的 和 父节点比较 选出最大的 largest = arr[largest] > arr[index] ? largest : index; //最大是本身 直接跳出 if(largest == index){ break; } swap(arr,largest,index); //交换后 继续向下比较调动 index = largest; left = index * 2 + 1; } } public static void swap(int arr[] , int i ,int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
原文:https://www.cnblogs.com/zhang-liubai/p/14920402.html