算法原理

堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近视完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

  1. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排序。
  2. 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排序。
    堆排序的平均时间复杂度为O(nlogn)。

算法描述

  1. 将初始待排序关键字序列(R1,R2,…,Rn)构建成大顶堆,以此为初始的无序区。
  2. 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,…,Rn-1)和新的有序区(Rn),且满足R[1,2,…,n-1]<=R[n]。
  3. 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要堆当前无序区(R1,R2,…,Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2,…,Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

动图展示

注:动图来源于菜鸟教程

算法实现


/*** 堆排序*/
public class HeapSort {public static void main(String[] args) {int[] arr = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};arr = heapSort(arr);printArray(arr);}public static void printArray(int[] arr){for(int a : arr)System.out.print(a+",");System.out.println();}public static int[] heapSort(int[] arr){int len = arr.length;buildMaxHeap(arr,len);for(int i=arr.length-1;i>0;i--){swap(arr,0,i);len--;heapify(arr,0,len);}return arr;}public static void swap(int[] arr, int i, int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void buildMaxHeap(int[] arr,int len){ // 建立大顶堆for(int i = (int) Math.floor(len/2); i>=0; i--){heapify(arr,i,len);}}public static void heapify(int[] arr, int index, int len){ //堆调整int left=index*2+1;int right=index*2+2;int largest=index;if(left < len && arr[left] > arr[largest]){largest = left;}if(right < len && arr[right] > arr[largest]){largest = right;}if(largest != index){swap(arr,index,largest);heapify(arr,largest,len);}}
}

十大经典排序算法之堆排序(Java代码实现)相关推荐

  1. 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)

    上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...

  2. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  3. 十大经典排序算法(图解与代码)——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序(Python and Java)

    排序 重新排列表中的元素,使表中的元素按照关键字递增或者递减 内部排序: 指在排序期间,元素全部存放在内存中的排序 外部排序: 指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断 ...

  4. java分治法求数列的最大子段和_Java十大经典排序算法动画解析和 代码实现

    排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序. 内部排序是数据记录在内存中进行排序. 而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排 ...

  5. c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...

    以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...

  6. 终于,把十大经典排序算法汇总了!(Java实现版)

    转载自  终于,把十大经典排序算法汇总了!(Java实现版) 最近几天在研究排序算法,看了很多博客,发现网上有的文章中对排序算法解释的并不是很透彻,而且有很多代码都是错误的,例如有的文章中在" ...

  7. 十大经典排序算法(Java实现)

    排序算法的重要性不言而喻,为了加深对这十种算法的理解,固写此文. 目录 1.冒泡排序(Bubble Sort) 2.选择排序(Selection Sort) 3.插入排序(Insertion Sort ...

  8. 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...

  9. 【GIF动画+完整可运行源代码】C++实现 堆排序——十大经典排序算法之七

    十大经典排序算法系列博客-->传送门 堆排序Heapsort是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大 ...

最新文章

  1. 《Nature》挑战进化DNA突变理论!
  2. 360压缩电脑版_360压缩国际版
  3. u-boot分析之编译体验(零)
  4. 用GDB调试程序(四)
  5. android函数未定义,android – 方法findViewById(int)未定义
  6. my Note debug - add to function
  7. 繁体简体转换器 v 1.0
  8. mysql优化之连接优化
  9. Chrome 爬虫插件 Web Scraper
  10. Google Chrome 1.0.154.46稳定版本发布 修复高危安全漏洞
  11. 计算机基础(五):堆和栈区别
  12. 【面试】JavaEE基础
  13. Java基础---Java---IO流-----File 类、递归、删除一个带内容的目录、列出指定目录下文件夹、FilenameFilte
  14. PHP排序算法之快速排序
  15. ATT CFO将于6月告退 公司审计官接任
  16. cruzer php sandisk 闪迪u盘量产工具_闪迪u3量产工具下载 SanDisk Cruzer Micro(闪迪u盘量产工具) V1.0 官方免费版(附使用说明) 下载-脚本之家...
  17. python绘制折线图保存_利用python向excel文件写数据并绘制折线图
  18. 2B市场 面向2025年技术趋势与5大机会
  19. WordpressCMS主题开发04-如何在首页调用各个分类下的文章以及图片栏目
  20. android动态设置渐变背景

热门文章

  1. ubuntu18安装和美化教程
  2. mysql创建表格显示1064错误_尝试创建表时出现错误1064(Error 1064 when trying to create a table)...
  3. HAN文本分类与tensorflow实现
  4. Windows 2003 服务器目录安全权限设置
  5. samba配置共享用户home目录
  6. JavaScript:使用键盘/鼠标来移动标签
  7. 面试官:从 MySQL 读取 100w 数据进行处理,应该怎么做?问倒一大片!
  8. XML语言数据读写理解16
  9. kafka消息队列系统
  10. Android 1.5 到 10.0 新特性