一、定义
是指用树的结构,利用树与数组的对应关系遍历数组。
左子树为:2*n+1,
右子树为:2*n+2;
最后一个父节点的位置为:arr.length/2-1,倒数第二个父节点为:arr.length/2-1
二、思想
1.根据升序和降序而定,构建成一个大顶堆或者小顶堆,
2.将堆顶元素和末尾元素交换
3.重新调整结构,满足大顶堆或者小顶堆,将堆顶元素和末尾元素交换,反复执行
三、代码
public static void main(String[] args) { int[] arr = {4,6,8,5,9}; sort(arr); System.out.println(Arrays.toString(arr)); } /** * 通过堆排序,首先要明确升序、降序;升序使用大顶堆,降序使用小顶堆。 * 大顶堆为父节点的值大于叶子节点的值, 小顶堆为父节点小于叶子节点的值 * 思想:先取出第一个父节点, */ public static void sort(int[] arr) { //1.构建成一个大顶堆或者小顶堆 for(int i = arr.length/2-1;i>=0;i--) { initBigHeap(arr, i, arr.length); System.out.println("-"+Arrays.toString(arr)); } //2.将堆顶元素和末尾元素交换 //3.重新调整结构,满足大顶堆,将堆顶元素和末尾元素交换,反复执行 for (int i = arr.length-1; i>0 ; i--) { int temp = arr[i]; arr[i] = arr[0]; arr[0] = temp; initBigHeap(arr, 0, i);//??构建成大顶堆之后,只需要对比根节点下的两个叶节点,自己画图之后即可知晓。 System.out.println("排序"+Arrays.toString(arr)); } } /** * 大顶堆 * @param arr:待调整的数组 * @param i:表示非叶子节点的位置 * @param length:数组的长度 */ public static void initBigHeap(int[] arr,int i,int length) { int temp = arr[i]; for (int j = 2*i+1; j < length; j=2*j+1) { if(j+1 < length && arr[j] < arr[j+1]) {//防止数组越界并进行左右子节点比较 j++; } if(arr[j] > temp) { arr[i] = arr[j]; i = j; //指向k,用于赋值给父节点 }else { break; } } arr[i] = temp; } |