堆排序:
一棵完全二叉树,如果父节点的值大于等于左右节点的值,则称此完全二叉树为小根堆(小顶堆);如果父节点的值小于等于左右节点的值,则次完全二叉树为大根堆(大顶堆)。

堆排序是建立在大顶堆或小顶堆的基础上的,通过不断的交换堆顶元素和堆尾元素,来对数组排序。基于大顶堆的堆排序,数组排序结果是升序的。基于小顶堆的堆排序,数组排序结果是降序的。

流程:
(1)建立堆 (注意调整的顺序是:从右往左,从下往上)
(2)交换堆顶与堆底元素
(3)调整堆(注意调整的顺序是:从0开始)

代码:

public class DuiPaiXu {
//堆排序
public static void heapSort(int[] array) {
if(array == null || array.length <=1 ) {
return;
} int totalIndex = array.length-1;
buildHeap(array,totalIndex); while(totalIndex > 0) {
swap(array,0,totalIndex);
if(--totalIndex == 0) {
break;
}
adjustHeap(array,0, totalIndex);
}
} //根据数组建立堆
public static void buildHeap(int[] array,int totalIndex) {
  //注意这里i是从(totalIndex-1)/2-1开始的,因为我索引值是从0开始的。
for(int i=(totalIndex-1)/2-1; i>=0; i--) {
adjustHeap(array,i, totalIndex);
}
} //调整堆
public static void adjustHeap(int[] array,int curIndex, int totalIndex) {
int biggestIndex = curIndex;
int leftIndex = 2*curIndex +1;
int rightIndex = 2*curIndex +2; if(rightIndex <= totalIndex) {
if(array[curIndex] <array[leftIndex] || array[curIndex] <array[rightIndex]) {
biggestIndex = array[leftIndex] > array[rightIndex] ? leftIndex : rightIndex;
}
} else if(leftIndex <= totalIndex ) {
if(array[curIndex] <array[leftIndex]) {
biggestIndex = leftIndex;
}
} if(biggestIndex != curIndex) {
swap(array, curIndex, biggestIndex); adjustHeap(array, biggestIndex, totalIndex);
} } public static void swap(int[] array,int i1, int i2) {
int temp = array[i1];
array[i1] = array[i2];
array[i2] = temp;
} public static void main(String[] args) {
int[] array = {1,3,76,34,23,45,85,46,37};
heapSort(array);
for(int i=0; i<array.length; i++) {
System.out.print(array[i] + " ");
}
}
}

堆排序—Java的更多相关文章

  1. 堆排序 java实现

    import java.util.Arrays; /* * 思路: * 1.方法adjustDown:对于一个数组a[],针对第i个数进行向下(直到len-1)调整,使得该位置成为大顶堆 * 2.方法 ...

  2. 堆排序 java

    <pre name="code" class="java">package heapSort; /** * 大根堆 * @author root * ...

  3. 堆排序(Java数组实现)

    堆排序:利用大根堆 数组全部入堆,再出堆从后向前插入回数组中,数组就从小到大有序了. public class MaxHeap<T extends Comparable<? super T ...

  4. 排序算法(三)堆排序及有界堆排序Java实现及分析

    1.堆排序基数排序适用于大小有界的东西,除了他之外,还有一种你可能遇到的其它专用排序算法:有界堆排序.如果你在处理非常大的数据集,你想要得到前 10 个或者前k个元素,其中k远小于n,它是很有用的. ...

  5. 堆排序——Java实现

    一.堆排序 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 二.堆 什 ...

  6. 堆排序Java实现

    package practice; import edu.princeton.cs.algs4.StdRandom; public class TestMain { public static voi ...

  7. 堆排序算法 java 实现

    堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...

  8. 20172302 《Java软件结构与数据结构》第八周学习总结

    2018年学习总结博客总目录:第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 教材学习内容总结 第十二章 优先队列与堆 1.堆(heap)是具有两个附加属性的一棵二叉树: (1)它是一 ...

  9. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

随机推荐

  1. Redux源码分析之compose

    Redux源码分析之基本概念 Redux源码分析之createStore Redux源码分析之bindActionCreators Redux源码分析之combineReducers Redux源码分 ...

  2. Redis-事务即简单锁应用

    Redis支持简单的事务, Redis允许一组命令在单一步骤中执行, 事务有两个属性 事务是一个单独的隔离操作, 事务中所有的命令都会序列化, 按照顺序执行. Redis事务是原子性的, 即要么都执行 ...

  3. 阿里消息队列中间件 RocketMQ源码解析:Message发送&接收

  4. properties文件作用以及在哪些地方用

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  5. textarea的换行符处理以及正确的在Html中显示

    个人不太喜欢在页面做过多的逻辑处理,贴出java的处理方式 /** * Html转换为TextArea文本 * @return */ public static String HtmlToText(S ...

  6. Thinkphp5 实现悲观锁

    悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依 ...

  7. shell 字符串

    字符串可以分为单引号,双引号,也可以不用引号 单引号 str='this is string' 单引号字符的限制: 单引号中的任何字符都会原样输出,单引号中变量是无效的 单引号中不能出现单引号 双引号 ...

  8. 深度理解div+css布局嵌套盒子

    1. 网页布局概述 网页布局的概念是把即将出现在网页中的所有元素进行定位,而CSS网页排版技术有别于传统的网页排版方法,它将页面首先在整体上使用<div>标记进行分块,然后对每个快进行CS ...

  9. 【环境搭建】使用Jekyll搭建Github博客

    前言 昨天花了差不多一天的时间,使用Jekyll搭建起了一套Github博客,感觉不错,也特将搭建过程记录下来,方便有需要的朋友自行搭建. 搭建步骤 本环境是在Linux环境下搭建完成的 安装前建议使 ...

  10. C#多线程的用法3-线程间的协作Join

    在创建多线程应用程序时,如何确保线程间的协作往往比让线程工作更重要. 线程间的协作最简单的方式是采用Join来进行,如下: /// <summary> /// 多线程协作-Join方式 / ...