本文共 1283 字,大约阅读时间需要 4 分钟。
➢ 基本介绍
arr[i]>=arr[2*i+1] && arr[i] >=arr[2*i+2]
//i对应第几个节点,i从开始编号 反之小顶锥就是小于。➢ 基本思想
➢代码实现
// 构建大顶锥 i:索引 length:多少元素需要调整,length-- public static void BigHeap(int[] arr, int i, int length) { int temp = arr[i]; // 调整位置 // k = i * 2 + 1 k是i的左子节点 for (int k = i * 2 + 1; k < length; k = k * 2 + 1) { if (k + 1 < length && arr[k] < arr[k + 1]) { // 左子节点的值小于右子节点的值 k++; } if (arr[k] > temp) { // 子节点大于父节点进行交换 arr[i] = arr[k]; i = k; } else { break; } } arr[i] = temp; }
详情见下图:
添加交换方法public static void heap(int[] arr) { int temp = 0; for (int i = arr.length / 2 - 1; i >= 0; i--) { BigHeap(arr, i, arr.length); } for (int j = arr.length - 1; j > 0; j--) { temp = arr[j]; arr[j] = arr[0]; arr[0] = temp; BigHeap(arr, 0, j); } }
在main函数当中进行测试:
int arr[] = { 4, 8, 9, 6, 2, 18, 51, 0, -4, 95, -78 }; heap(arr); System.out.println(Arrays.toString(arr));
很显然:
在先前发的博文当中对堆排序的时间效率进行测试:测试10000000个数据基本上在几秒之间,转载地址:http://dgmzi.baihongyu.com/