基本概念:

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

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

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

  一般将二叉堆简称为堆。

 基本思想:

  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. dotnetnuke 头像调用 头像缩放

    public static string GetProfileImage(int userId, int width, int height)        {                     ...

  2. GitHub代码托管平台搭建

    GitHub代码托管平台搭建 注册账户以及创建仓库 要想使用github第一步当然是注册github账号了, github官网地址:https://github.com/. 之后就可以创建仓库了(免费 ...

  3. cookie范例

    GET /locate/api/getLocByIp?key=C6E22B7D480E3312C74EC7EF013E50C5&callback=bowlder.cb._0 HTTP/1.1 ...

  4. Android中Webview使用经验总结

    很早前就喜欢在Android中使用Webview组件结合JS来做应用,总结了一些不错的小经验,在这里持续更新,自己备忘,也希望给其他需要的同学一些参考- 1.添加权限 要用Webview,确认你在** ...

  5. 11.11如何卖到一个亿:从0到1的电商爆品打造术 电子书 PDF

    内容转自:https://download.csdn.net/download/chenyao1994/11191034 下载地址:https://pan.baidu.com/s/1uQ1cjm9QH ...

  6. Java学习【第1篇】:数据类型(2019-02-13 11:00)

    1.Java 基本数据类型 Java 的两大数据类型: 1.内置数据类型 byte.short.int.long.float.double.boolean.char 2.引用数据类型  指向一个对象, ...

  7. 洛谷——P3906 Geodetic集合

    P3906 Geodetic集合 题目描述 图G是一个无向连通图,没有自环,并且两点之间至多只有一条边.我们定义顶点v,u最短路径就是从v到u经过边最少的路径.所有包含在v-u的最短路径上的顶点被称为 ...

  8. JS练习:替换式图片自动轮播

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  9. zabbix4.0搭建(基于CentOS6.8)

    环境 服务端:188.188.3.241,系统:centos6.8,mysql:5.7.3,php:5.4.9,nginx:1.12.0   一.nginx编译安装 NGINX_VERSION=1.1 ...

  10. Laravel实用小功能

    Laravel实用小功能 1.控制访问次数 laravel5.2的新特性,通过中间件设置throttle根据IP控制访问次数 原理:通过回传三个响应头X-RateLimit-Limit,X-RateL ...