排序算法(5)----堆排序
来源:互联网 发布:什么是网络消费贷款 编辑:程序博客网 时间:2024/06/05 20:00
这篇博客从以下几个方面来说:
- 什么是最大堆以及代码实现
- 堆排序基础代码
- 一次优化(提高效率)
- 二次优化(原地堆排序,无需额外空间)
1.什么是最大堆以及代码实现
这里可以参考言简意赅的博客:堆与最大堆
2.堆排序基础代码
import com.heap.MaxHeap;import utils.CreateRandom;public class HeapSort { //堆排序,将需要排序的数组中的元素全部依次入堆,然后反向的取出最大值. // 算法复杂度 O(n * log n) public static int[] heapSort_1(int[] arr) { MaxHeap maxHeap = new MaxHeap(arr.length); for (int anArr : arr) { maxHeap.insert(anArr); } for (int i = arr.length - 1; i >= 0; i--) { arr[i] = maxHeap.extrackMax(); } return arr; }}
3.一次优化
import com.heap.MaxHeap;import utils.CreateRandom;public class HeapSort { /*优化1:Heapify * 最大堆特性: * 一个没有子节点的节点,可以看做是只有一个根节点的堆, * arr[count / 2] 即为堆中第一个拥有节点的节点 * 因此只需要从下向上的,依次执行shiftDown操作,由小的堆逐渐变成大的堆就可以了 * 算法复杂度 O(n) * */ public static int[] heapSort_2(int[] arr) { MaxHeap maxHeap = new MaxHeap(arr); //在向 MaxHeap 中传入 arr 数组后,整个数组已经满足最大堆 for (int i = arr.length - 1; i >= 0; i--) { arr[i] = maxHeap.extrackMax(); } return arr; }}
4.二次优化(原地堆排序)
import com.heap.MaxHeap;import utils.CreateRandom;public class HeapSort { /*优化2:原地堆排序 * 在最大堆中,将第一个位置的值(同时也是最大值)与数组最后一个位置交换位置,在原数组的基础上直接得到有序数组, * 而不需要开辟新的数组空间来存储堆中排好序的元素. * */ public static int[] heapSort_3(int[] arr) { MaxHeap maxHeap = new MaxHeap(arr); return maxHeap.sortInside(); }}
阅读全文
0 0
- 排序算法(5)----堆排序
- 排序算法--堆排序
- 排序算法-堆排序
- 排序算法---堆排序
- 【排序算法】堆排序
- 排序算法-堆排序
- 排序算法---堆排序
- 排序算法--堆排序
- 排序算法----堆排序
- 排序算法--堆排序
- 排序算法 堆排序
- 排序算法-堆排序
- 排序算法:堆排序
- 排序算法---堆排序
- 【排序算法】堆排序
- 排序算法:堆排序
- 排序算法-堆排序
- 排序算法:堆排序
- 2017/08/28 二叉搜索树
- 高性能流媒体服务器EasyDSS前端重构(一)-从零开始搭建 webpack + vue + AdminLTE 多页面脚手架
- Redis[三] @Hash 哈希
- GBK和UTF-8互转尾部乱码问题分析
- 02:浮点型数据类型存储空间大小
- 排序算法(5)----堆排序
- 循环队列的实现
- 关于static_cast、dynamic_cast、const_cast、reinterpret_cast
- Java -IO
- 51 nod 1495 中国好区间 奇葩卡时间题 700ms 卡O(n-log(n)), 思路:O(n)尺取法
- googlevr for unity 快速制作全景视频播放器
- 用svn版本号或其他信息找历史内容
- sql之left join、right join、inner join的区别
- Unity 几个插件