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

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

流程:
(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. Elasticsearch,Kibana,Logstash,NLog实现ASP.NET Core 分布式日志系统

    Elasticsearch - 简介 Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据.它使用 Java 编写,基于 Apac ...

  2. RobotFramwork安装报错name 'execfile' is not defined

    安装RobotFramwork的时候,提示了这个?是什么原因呢? 本机装的是python3.6: 经官方回复得知识因为python的版本不兼容该模块的安装. 官方认定版本是2.7,所以这里推荐大家玩p ...

  3. opencv+python3.4的人脸识别----2017-7-19

    opencv3.1  +  python3.4 第一回合(抄代码,可实现):人脸识别涉及一个级联表,目前能力还无法理解. 流程:1.读取图像---2.转换为灰度图---3.创建级联表---4.对灰度图 ...

  4. Opencv探索之路(二十):制作一个简易手动图像配准工具

    近日在做基于sift特征点的图像配准时遇到匹配失败的情况,失败的原因在于两幅图像分辨率相差有点大,而且这两幅图是不同时间段的同一场景的图片,所以基于sift点的匹配已经找不到匹配点了.然后老师叫我尝试 ...

  5. HDU1036 Average is not Fast Enough!

    Problem Description A relay is a race for two or more teams of runners. Each member of a team runs o ...

  6. JSON风格指南

    中文版:https://github.com/darcyliu/google-styleguide/blob/master/JSONStyleGuide.md 英文版:https://google.g ...

  7. Linux学习-->linux系统在移动硬盘的安装

    由于自己看了一些文章和linux的好奇,想来一窥Linux的奥秘,因此自己准备学习使用Linux系统,这里记录下自己的安装过程,方便以后自己重装系统时进行查阅. 参考的书籍是鸟哥的<Linux私 ...

  8. bzoj3728: PA2014Final Zarowki

      Description 有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照亮. 你可以去附近的商店换新灯泡,商店里所有正整数功率的 ...

  9. mongodb分片部署

    Mongodb 分片部署 配置mongodb集群,比如 在3个server上配置 3 shard的Mongodb集群: 架构: 1.每片数据需要3个mongod server,2个为主从数据节点:1个 ...

  10. JSR-303 Bean Validation 介绍及 Spring MVC 服务端参数验证最佳实践

    任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情. 应用程序必须通过某种手段来确保输入参数在上下文来说是正确的. 分层的应用很多时候同样的数据验证逻辑会出现在不同的层,这样 ...