基本概念:

  二叉堆是完全二叉树或者是近似完全二叉树。

  当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆

  当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆

  一般将二叉堆简称为堆。

 基本思想:

  1.把n个元素建立最大堆,把堆顶元素A[0]与待排序序列的最后一个数据A[n-1]交换;

  2.把剩下的n-1个元素重新建立最大堆,把堆顶元素A[0]与待排序序列的最后一个元素A[n-2]交换;

  3.把剩下的n-2个元素重新建立最大堆,把堆顶元素A[0]与待排序序列的最后一个元素A[n-3]交换;

  重复以上步骤,直到把最后两个元素建成最大堆并进行交换,得到的序列就是排序后的有序序列。

 

 堆排序是不稳定的排序算法,时间复杂度为:O(NlogN).

 Java实现:

package sort;
public class HeapSort{
public static void main(String[] args)
{
new HeapSort().run();
}
public void run(){
int [] a={,,,,,};
int len=a.length;
/**
* 循环建堆
*/
for(int i=;i<len-;i++){
/**
* 建堆,建一次最大堆,寻到一个待排序序列的最大数
*/
buildMaxHeap(a,len--i);
/**
* 交换堆顶(待排序序列最大数)和最后一个元素
*/
swap(a,,len--i);
} for(int j=;j<len;j++){
System.out.print(a[j]+" ");
}
}
/**
* 对数组 从0到lastIndex建大顶堆
*/
public void buildMaxHeap(int[] arr, int lastIndex){
/**
* 从最后一个节点(lastIndex)的父节点开始
*/
for(int i=(lastIndex-)/;i>=;i--){
/**
* k保存正在判断的节点
*/
int k=i;
/**
* 如果当前k节点的子节点存在
*/
while(k*+<=lastIndex){
/**
* k节点的左子节点的索引
*/
int biggerIndex=*k+;
/**
* 如果k节点的左子节点biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在
*/
if(biggerIndex<lastIndex){
/**
* 若果右子节点的值较大
*/
if(arr[biggerIndex]<arr[biggerIndex+]){
/**
* biggerIndex总是记录较大子节点的索引
*/
biggerIndex++;
}
}
/**
* 如果k节点的值小于其较大的子节点的值 ,交换他们
*/
if(arr[k]<arr[biggerIndex]){
swap(arr,k,biggerIndex);
/**
* 将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值
*/
k=biggerIndex;
}else{
/**
* 当前判断结点k(父结点),大于他的两个子节点时,跳出while循环
*/
break;
}
}
}
}
/**
* 交换下标为i、j的两个元素
*/
private void swap(int[] data, int i, int j) {
int tmp=data[i];
data[i]=data[j];
data[j]=tmp;
}
}

 结果展示:

  (本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~) 

排序系列 之 堆排序算法 —— Java实现的更多相关文章

  1. 排序系列 之 快速排序算法 —— Java实现

    基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变 ...

  2. 排序系列 之 归并排序算法 —— Java实现

    基本思想: 归并排序法是分治法的典型实例,分为分割和归并两部分. 把一个数组分为大小相近的子数组(分割),分别把子数组排好序后,通过合成一个大的排好序的数组(归并). 实例: 先分割成每个子序列只有一 ...

  3. 堆排序算法 java 实现

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

  4. 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...

  5. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

  6. 堆排序算法(Java实现)

    将待排序的序列构造成一个大顶堆(从大到小排要构造成小顶堆).此时,整个序列的最大值就是堆顶的根节点,将他和末尾元素交换,然后将剩余的length-1个节点序列重新构造成新的堆.重复执行,便能得到一个有 ...

  7. 排序系列 之 折半插入排序算法 —— Java实现

    基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中 ...

  8. 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  9. 排序算法入门之堆排序(Java实现)

    堆排序 在学习了二叉堆(优先队列)以后,我们来看看堆排序.堆排序总的运行时间为O(NlonN). 堆的概念 堆是以数组作为存储结构. 可以看出,它们满足以下规律: 设当前元素在数组中以R[i]表示,那 ...

随机推荐

  1. 一文读懂架构师都不知道的isinstance检查机制

    起步 通过内建方法 isinstance(object, classinfo) 可以判断一个对象是否是某个类的实例.但你是否想过关于鸭子协议的对象是如何进行判断的呢? 比如 list 类的父类是继 o ...

  2. 人工智能时代,你为什么一定要学Python?

    Python岗位年薪至少在10-20w之间,而且除了北.上.广.深外,杭州和合肥等二.三线城市的待遇正在与一线城市持平.未来,无论你身处何地,都能享受到人工智能.Python“带来的“市场红利”. P ...

  3. PAT_A1107#Social Clusters

    Source: PAT A1107 Social Clusters (30 分) Description: When register on a social network, you are alw ...

  4. 5.terms搜索多个值以及多值搜索结果优化

    主要知识点 terms搜索多个值,并和term的比较     一.term和terms terms是在这个字段中搜索多个值,相当于sql中的in语法 (select * from tbl where ...

  5. Linux - redis-cluster搭建

    目录 Linux - redis-cluster搭建 Linux - redis-cluster搭建 1.准备6个数据库节点,也就是6个redis实例,也就是6个配置文件 配置文件如下 redis-7 ...

  6. 第五节:DataFrame聚合函数

  7. 解决git pull每次提示输入账号密码的问题

    每次用git同步代码的时候,都会提示输入账号密码,很麻烦,费时间,所以找了一种可以免去每次都要输入账号密码的方法 1. git bash进入你的项目目录 2. 输入以下命令会在配置文件里添加信息,作用 ...

  8. Redis 原子操作INCR

    The content below come from http://try.redis.io/ There is something special about INCR. Why do we pr ...

  9. 【Codeforces 1114B】Yet Another Array Partitioning Task

    [链接] 我是链接,点我呀:) [题意] 让你把数组分成k个连续的部分 使得每个部分最大的m个数字的和最大 [题解] 把原数组降序排序 然后选取前m*k个数字打标记 然后对于原数组 一直贪心地取 直到 ...

  10. 【[Offer收割]编程练习赛13 B】最大子矩阵(自己的思路)

    [题目链接]:http://hihocoder.com/contest/offers13/problem/2 [题意] [题解] 算出1..250*250这些数字每个数字的所有因子(成对的那种,即x* ...