堆排序详解 以你之姓@ 2022-08-21 03:22 194阅读 0赞 public class HeapSort { public static void main(String[] args) { int n = (int)(Math.random()*100); int a[] = new int[n]; for(int i=0; i<n; i++){ a[i] = (int)(Math.random()*200); } heapSort(a, n); for(int i=0; i<n; i++){ System.out.print(a[i]+" "); } } /** * 堆排序 * 原理:通过维护最大堆 或 最小堆 实现堆排序,最大堆(最小堆)是完全二叉树,要求父节点大于或等于(<=)子节点. * @param a 待排序数组 * @param len 数组长度 */ public static void heapSort(int a[], int len){ int lastParentIndex = getParentIndex(len-1); //最后一个父节点 for(int i=lastParentIndex; i>=0; i--){ //从最后一个父节点往前创建最大堆 maxHeapify(a, i, len); } //此时已经完成了最大堆的构建,下面进行排序。 for(int i=len-1; i>0; i--){ //交换第一个元素(最大的一个)与最后一个元素。 a[i] = a[0]^a[i]; a[0] = a[0]^a[i]; a[i] = a[0]^a[i]; maxHeapify(a, 0, i);//维护剩下的元素为最大堆。 } } //维护最大堆,保证父节点大于等于子节点 public static void maxHeapify(int a[], int index, int len){ int leftChildIndex = getLeftChildIndex(index); //左儿子下标 int rightChildIndex = getRightChildIndex(index); //右儿子下标 int maxIndex = index; //父节点,左儿子,右儿子 中最大的下标,默认是父节点 if(leftChildIndex<len && a[leftChildIndex]>a[maxIndex]){ //比较左儿子与最大值 maxIndex = leftChildIndex; } if(rightChildIndex<len && a[rightChildIndex]>a[maxIndex]){ //比较右儿子与最大值 maxIndex = rightChildIndex; } if(maxIndex != index){ //如果最大值不是父节点的话,交换父节点与最大值。保证了父节点大于等于子节点。 a[maxIndex] = a[maxIndex]^a[index]; a[index] = a[maxIndex]^a[index]; a[maxIndex] = a[maxIndex]^a[index]; maxHeapify(a, maxIndex, len); //交换过后,不能保证交换过后的子节点的下面是最大堆。所以递归 } } //获取当前节点的父节点下标 public static int getParentIndex(int index){ return (index-1)/2; } //获取当前节点的左儿子下标 public static int getLeftChildIndex(int index){ return index*2+1; } //获取当前节点的右儿子下标 public static int getRightChildIndex(int index){ return (index+1)*2; } }
相关 排序-堆排序 1.堆排序前言 前面博客中讲到简单选择排序,它在待排序的n个记录中选择一个最小的记录需要比较n-1次。本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否则如何知 旧城等待,/ 2022年09月30日 06:45/ 0 赞/ 259 阅读
相关 堆排序详解 基本概念: 要了解堆排序,首先要了解什么是堆, 要了解堆,还要先了解什么是完全二叉树。 一、什么是完全二叉树? 完全二叉树(complete bin ﹏ヽ暗。殇╰゛Y/ 2022年09月26日 00:25/ 0 赞/ 199 阅读
相关 堆排序详解 public class HeapSort { public static void main(String[] args) { int 以你之姓@/ 2022年08月21日 03:22/ 0 赞/ 195 阅读
相关 堆排序详解 概述 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆, 我不是女神ヾ/ 2022年07月18日 05:10/ 0 赞/ 148 阅读
相关 【排序】堆排序 堆的定义 设有n个元素的序列 k1,k2,…,kn,当且仅当满足下述关系之一时,称之为堆。 ![图示][SouthEast] 解释:如果让满足以上条件的元素序列 (k 分手后的思念是犯贱/ 2022年06月18日 11:47/ 0 赞/ 291 阅读
相关 堆排序详解 本文是转载文章,文章的来源:csdn博客 博主:带鱼兄 文章:堆排序详解 博文地址:https://blog.csdn.net/daiyudong2020/arti ゝ一纸荒年。/ 2022年05月26日 12:15/ 0 赞/ 306 阅读
相关 堆排序详解 概述 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆, 以你之姓@/ 2022年04月11日 07:25/ 0 赞/ 253 阅读
相关 堆排序详解 ![在这里插入图片描述][20190309110850502.png] 设有一个无序序列 \{ 1, 3, 4, 5, 2, 6, 9, 7, 8, 0 \}。 1、构 桃扇骨/ 2022年03月10日 03:26/ 0 赞/ 234 阅读
相关 堆排序详解 堆排序是很有难度的算法。搞懂之后就觉得,"还行吧"。 先讲个故事: 周日学校有开个实习的招聘会,没有拿到大公司offer的我,当然约上舍友走起啦。第一家,有人在面试了,那我就 「爱情、让人受尽委屈。」/ 2021年09月29日 19:10/ 0 赞/ 578 阅读
相关 排序-堆排序 [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 在说明堆排序的过程前得先了解什么是堆: 先看下图(来源 清疚/ 2021年09月20日 03:22/ 0 赞/ 469 阅读
还没有评论,来说两句吧...