基本概念:

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

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

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

  一般将二叉堆简称为堆。

 基本思想:

  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. Git与SVN版本控制系统

    关于版本控制 什么是版本控制?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.在本书所展示的例子中,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任 ...

  2. SetACL 使用方法详细参数中文解析

    示例: SetACL.exe c:\nihao /dir /deny everyone /read_ex 设置E:\wxDesktop 文件夹 everyone 用户为读取和运行权限 SetACL M ...

  3. Centos 安装配置iscsi

    在测试oracle rac的时候用iscsi来模拟磁阵的(真的磁阵需要多路径软件),简单的记录下 #scsi server yum install scsi-target-utils service ...

  4. HDU_1113_字符串处理

    Word Amalgamation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  5. 表单enctype属性传值问题

    form表单的enctype设置为multipart/form-data后,表单中除了文件后台能拿到,其他值后台都拿不到. 知识点: 一.application/x-www-form-urlencod ...

  6. Lua中返回值的丢失问题

    Lua中返回值的丢失问题 -- 如果函数调用所得的多个返回值是另外一个函数的最后一个参数,或者是多指派表达式中的最后一个参数时,所有返回值将被传入或使用. -- 否则只有第一个返回值被使用或指定. T ...

  7. B.4 集

    在.NET 3.5之前,框架中根本没有公开集(set)集合.如果要在.NET 2.0中表示集,通常会 使用 Dictionary<,> ,用集的项作为键,用假数据作为值..NET3.5的 ...

  8. 编译OpenWrt失败

    /home/fly/work_dir/OpenWrt-SDK/OpenWrt-Test/trunk/scripts/download.pl "/home/fly/work_dir/OpenW ...

  9. flask_model防止循环引用

    1 首先介绍app-model的循环引用 https://www.cnblogs.com/fuzzier/p/7920645.html 2 解决方式 https://www.cnblogs.com/f ...

  10. bug的分类和等级

    一.bug的定义 软件的bug,狭义指软件程序的漏洞或缺陷,广义指测试工程师或用户提出的软件可改进的细节.或与需求文档存在差异的功能实现等 对应三个测试目的:(3个为了) 1.为了发现程序的代码或业务 ...