堆排序,顾名思义就是利用堆这个数据结构对数据项进行排序。前面提到过。堆数据结构中。节点大于或等于自己的子节点。那么我们能够将待排序的数据项依次加入到堆中,然后再依次取出根节点就可以。从堆中取出的数据项是从大到小排列的。由于根节点永远是最大的。而堆中永远是取根节点。假设对堆这样的数据结构不太了解的话,能够先看这篇博文:数据结构和算法之 堆。这里不再赘述。

以下我们来看看堆排序的实现(假设程序有不清楚的地方。也能够參考上面那篇博文)。

public class HeapSort {private int[] array;private int currentIndex;private int maxSize;public HeapSort(int size) {maxSize = size;array = new int[maxSize];currentIndex = 0;}//插入数据项,并排好序public void insertSort(int[] source) {for(int i = 0; i < source.length; i++) {array[currentIndex] = source[i]; //插入到节点尾tickedUp(currentIndex++); //向上又一次排好序。使得满足堆的条件}}private void tickedUp(int index) {int parentIndex = (index - 1) / 2; //父节点的索引int temp = array[index]; //将新加的尾节点存在temp中while(index > 0 && array[parentIndex] < temp) {array[index] = array[parentIndex];index = parentIndex;parentIndex = (index - 1) / 2;}array[index] = temp;}//取出最大值public int getMax() {int maxNum = array[0];array[0] = array[--currentIndex];trickleDown(0);return maxNum;}private void trickleDown(int index) {int top = array[index];int largeChildIndex;while(index < currentIndex/2) { //while node has at least one childint leftChildIndex = 2 * index + 1;int rightChildIndex = leftChildIndex + 1;//find larger childif(rightChildIndex < currentIndex &&  //rightChild exists?array[leftChildIndex] < array[rightChildIndex]) {largeChildIndex = rightChildIndex;}else {largeChildIndex = leftChildIndex;}if(top >= array[largeChildIndex]) {break;}array[index] = array[largeChildIndex];index = largeChildIndex;}array[index] = top;}
}

算法分析:堆中插入和取出的时间复杂度均为O(logN),所以堆排序算法的时间复杂度为O(NlogN)。可是堆排序也须要额外的和待排序序列大小同样的存储空间。空间复杂度为O(N)。

_____________________________________________________________________________________________________________________________________________________

-----乐于分享。共同进步!

-----很多其它文章请看:http://blog.csdn.net/eson_15

转载于:https://www.cnblogs.com/yutingliuyl/p/7244641.html

【数据结构和算法16】堆排序相关推荐

  1. 数据结构与算法之堆排序

    数据结构与算法之堆排序 目录 堆排序介绍 代码实现 1. 堆排序介绍 堆排序(Heapsort)是指利用堆((英语:heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组 ...

  2. Python天天美味(32) - python数据结构与算法之堆排序

    1. 选择排序 选择排序原理是先选出最小的数,与第一个数交换,然后从第二个数开始再选择最小的数与第二个数交换,-- def selection_sort(data):     for i in ran ...

  3. 线性表11|单链表小结:腾讯面试题 - 数据结构和算法16

    线性表11|单链表小结:腾讯面试题 让编程改变世界 Change the world by program 静态链表的删除操作 我们的故事还没结束,小C看到小A和2B这样非法的勾当,内心觉得很不爽,一 ...

  4. 数据结构与算法之六堆排序

    堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]& ...

  5. 【数据结构排序算法系列】数据结构八大排序算法

    排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将 ...

  6. 数据结构与算法详解(含算法分析、动图图解、Java代码实现、注释解析)

    数据结构和算法的重要性 算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算 数据结构和算法的关系: 程序 = 数据结构 + 算法 数据结构是算法的基础, 换言之,想要学好算法,需要把数 ...

  7. 数据结构与算法 / 排序算法 / 堆排序

    一.定义 借助堆结构实现的排序算法被称为堆排序. 二.过程说明 1.建堆 (1)方法1 原地建堆,对于数组来说,从前往后:对于树来说,从下向上. 将数组的第一个元素作为堆顶,第二个元素做向堆中插入数据 ...

  8. 数据结构与算法:十大排序算法之堆排序

    数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...

  9. java堆排序图解_108-堆排序的思路图解_清华毕业老程序员亲授通俗易懂的Java数据结构和算法​​​​教程_Java视频-51CTO学院...

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

最新文章

  1. 贾珈:自然语言处理中9个不可不知的研究热点(附视频)
  2. ATM(BZOJ 1179)
  3. 天梯赛 L1-025 正整数A+B (15 分)
  4. 管道和过滤器模式----POSA模式助记格式
  5. 动态规划--Leetcode121.买卖股票的最佳时机
  6. 架构的变迁,从分层架构先聊起
  7. PHP7实战开发简单CMS内容管理系统(11)批量删除栏目数据
  8. 【HTML+CSS网页设计与布局 从入门到精通】第3章
  9. 程序员的职业技能不止于敲代码!
  10. linux 弱口令扫描,弱口令扫描神器XSCAN 一款经典弱口令扫描软件 可搜索各种端口(3389等) 各种系统(XP WIN7等) - 下载 - 搜珍网...
  11. 备战2022软考网络管理员(1)介绍与开篇
  12. mac教程:重置苹果Mac上的NVRAM或PRAM?
  13. 麒麟操作系统V10登录微信报错
  14. CBA离好生意还差几个NBA?
  15. 使用echarts中国地图上绘制散点图(自适应宽高)
  16. net bios支持服务器,禁用NetBIOS巧妙解决网络不通故障
  17. 【SpringMVC】Resultful风格映射url
  18. 计算机智能未来发展趋势,在未来,人工智能的几个发展方向或趋势!
  19. BUUCTF msic 专题(120)[QCTF2018]X-man-A face
  20. webstorm 2018 激活破解方法大全 亲测第三个有用

热门文章

  1. python快速入门第三版-Python 快速入门:第3版 配套资源 PDF 完整版
  2. python安装numpy-NumPy 安装
  3. 如何获取python的当前工作目录-python笔记(一)获取当前目录路径和文件
  4. SPOJ Ada and Spring Cleaning(hash)
  5. usaco Arithmetic Progressions
  6. 推荐一些C++经典书籍
  7. zend studio输出中文乱码的问题
  8. linux中的date的用法
  9. 微信朋友圈技术之道:三个人的后台团队与每日十亿的发布量
  10. 电商总结(八)如何打造一个小而精的电商网站架构