排序算法Java代码实现(六)—— 堆排序
2019-08-16 12:25:49来源:博客园 阅读 ()
排序算法Java代码实现(六)—— 堆排序
本片内容:
- 堆排序
堆排序
最大堆:
二叉堆是完全二叉树或者是近似完全二叉树,
当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。(父节点大于任何一个子节点)
算法思想:
- 把n个元素建立最大堆,把堆顶元素A[0]与待排序序列的最后一个数据A[n-1]交换;
- 把剩下的n-1个元素重新建立最大堆,把堆顶元素A[0]与待排序序列的最后一个元素A[n-2]交换;
- 把剩下的n-2个元素重新建立最大堆,把堆顶元素A[0]与待排序序列的最后一个元素A[n-3]交换;
重复以上步骤,直到把最后两个元素建成最大堆并进行交换,得到的序列就是排序后的有序序列。
代码实现:
/** * */ package com.cherish.SortingAlgorithm; /** * @author acer * */ public class Chapter_7_堆排序 extends ArrayBase { /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 int[] array = new int[] {3,4,7,9,2,5,1,8,6}; heapSorting(array); printArray(array); } //堆排序 public static void heapSorting(int[] array) { int arrayLength = array.length; //循环建堆 for(int i = 0;i < arrayLength-1;i++) { //建堆,建一次最大堆,寻找一个待排序列的最大数 buildMaxHeap(array,arrayLength-1-i); //交换堆顶元素(带排序序列的最大数)和最后一个元素 array[0]是堆顶 swap(array,0,arrayLength-1-i); } } //建最大堆 public static void buildMaxHeap(int[] array,int lastIndex) { //从最后一个节点(index)的父节点开始 for(int i = (lastIndex-1)/2 ; i >= 0; i--) { //k 保存正在判断的节点 int k = i; //如果当前k节点的子节点存在 while(k*2+1 <= lastIndex) { //k节点的左子节点的索引 int biggerIndex = 2*k + 1; //如果k节点的左子节点biggerIndex小于index,即biggerIndex+1代表的k节点的右子节点存在 if(biggerIndex < lastIndex) { //若右子节点的值较大 if(array[biggerIndex]<array[biggerIndex + 1]) { //biggerIndex总是记录较大子节点的索引 biggerIndex = biggerIndex + 1; } } //如果k节点的值小于其较大的子节点的值,交换他们 if(array[k] < array[biggerIndex]) { swap(array,k,biggerIndex); //将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值 k = biggerIndex; }else { //当前判断节点k(父节点)大于他的两个子节点时,跳出while循环 break; } } } } }
实现结果:
由上图可以看到,每次建立最大堆时,最大的数都在array[0],下一次建堆时,上一个最大的数已经移到数组尾部了。
原文链接:https://www.cnblogs.com/CherishTheYouth/p/CherishTheYouth_2019_0812_heapSort.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:函数接口
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- DES/3DES/AES 三种对称加密算法实现 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash