package sort.choose;
import java.util.Arrays;
/**
* @author chenyi
* @Description 二叉树遍历
* @date 2022/2/17 15:30
*/
public class HeapSort {
public static void main(String[] args) {
//int arr[] = {4,6,8,5,9};
int arr[] = {10, 6, 14, 4, 8, 12, 16, -1, 1, 99};
System.out.println("遍历顺序存储二叉树");
System.out.println(Arrays.toString(arr));
/*System.out.println("第一次堆排序");
adjustHeap(arr,arr.length/2-1,arr.length);
System.out.println(Arrays.toString(arr));
System.out.println("第二次堆排序");
adjustHeap(arr,1,arr.length);
System.out.println(Arrays.toString(arr));
System.out.println("第三次堆排序");
adjustHeap(arr,0,arr.length);
System.out.println(Arrays.toString(arr));*/
System.out.println("堆排序");
for (int i = (arr.length >> 1) - 1; i >= 0; i--) {
adjustHeap(arr, i, arr.length);
}
for (int i = arr.length - 1; i > 0; i--) {
// 把最大的数放到末尾
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
adjustHeap(arr, 0, i);
}
System.out.println(Arrays.toString(arr));
}
private static void adjustHeap(int[] arr, int i, int length) {
// 记录i的值
int temp = arr[i];
int max = i;
// 至少要有一个左节点吧
while (max * 2 < length - 1) {
// 比较树的左右节点
if (arr[2 * i + 1] > arr[max]) {
max = 2 * i + 1;
}
if (2 * i + 2 < length && arr[2 * i + 2] > arr[max]) {
max = 2 * i + 2;
}
if (max == i) {
break;
}
// 交换之后要考虑是否会影响子树,所以要对变更的节点进行再次调整
arr[i] = arr[max];
arr[max] = temp;
i = max;
}
}
}
堆排序
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- https://blog.csdn.net/qq_25800311/article/details/8976254...
- 原地堆排序思想 对于已经“堆化”的数据,堆顶的元素是最大的,对应到数组就是数组的第一个元素是最大的,原地的堆排序就...
- 堆基本概念 堆排序是一个很重要的排序算法,它是高效率的排序算法,复杂度是O(nlogn),堆排序不仅是面试进场考的...
- 堆排序就是把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出(最大堆调整的递归运算),这...
- 基础堆排序和 Heapify 这一节我们介绍两个使用堆或者说基于堆的思想进行排序的算法。 思路1:一个一个地往最大...