堆排序属于不稳定排序,时间复杂度为O(nlogn),是利用堆这种数据结构设计的排序算法,是一种选择排序
堆是一个近似完全二叉树的结构,每个节点值都大于或等于左右节点为大顶堆,小于等于为小顶堆
升序排序大顶堆,降序排序小顶堆
思想和方法:将原始数据构 n 造成大顶堆,此时最大值为根节点,然后与末尾的原始数据交换,最后即为最大值,然后剩下的 n - 1 个数据继续构建大顶堆,重复上面的步骤,最后一个数直接置于第一位,至此升序排序完成
import java.util.Arrays; public class HeapSort { public static void main(String[] args) { int arr[] = {4, 6, 8, 5, 9}; heapSort(arr); } public static void heapSort(int[] arr) { int temp; for (int i = arr.length / 2 - 1; i >= 0; i--) { adjustHeap(arr, i, arr.length); } for (int j = arr.length - 1; j > 0; j--) { temp = arr[j]; arr[j] = arr[0]; arr[0] = temp; adjustHeap(arr, 0, j); } System.out.println(Arrays.toString(arr)); } /** * @param arr 待调整数组 * @param i 非叶子节点在数组中的索引 * @param lenght 表示对多少个元素减少(逐渐减少) */ public static void adjustHeap(int arr[], int i, int lenght) { int temp = arr[i]; //k = i * 2 + 1 是i的左子节点 for (int k = i * 2 + 1; k < lenght; k = k * 2 + 1) { if (k + 1 < lenght && arr[k] < arr[k + 1]) { k++;//k指向右子节点 } if (arr[k] > temp) { arr[i] = arr[k]; i = k;//i 指向 k, 继续循环比较 } else { break; } } arr[i] = temp;//将temp值放到调整后的位置 } }
来源:https://www.cnblogs.com/bingbug/p/12294740.html