本文共 1486 字,大约阅读时间需要 4 分钟。
public static void heapSort(int[] arr) { if(arr == null || arr.length < 2) { return; } for(int i = 0; i < arr.length; i++) { heapInsert(arr, i); } int heapSize = arr.length; heapSize--; swap(arr, 0, heapSize); while (heapSize > 0) { heapify(arr, 0, heapSize); heapSize--; swap(arr, 0, heapSize); } } //插入一个新的节点让它变为大顶堆 把index的节点上浮 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的节点下浮 heapSize为元素的个数 public static void heapify(int[] arr, int index, int heapSize) { int left = 2 * index + 1;//获取左孩子 while (left < heapSize) { //左孩子没越界 //获取左右孩子最大值的下标 int largest = left + 1 < heapSize && arr[left] < arr[left + 1]? left + 1 : left; //然后与父节点比较 largest = arr[largest] > arr[index]? largest:index; if(largest == index) { break; } swap(arr, largest, index);//左右孩子的最大值与父节点交换 //继续找左孩子 index = largest; left = 2 * index + 1; } } public static void swap(int[] arr, int i, int j) { int a = arr[i]; arr[i] = arr[j]; arr[j] = a; }
转载地址:http://mqhzi.baihongyu.com/