基本概念:

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

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

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

  一般将二叉堆简称为堆。

 基本思想:

  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;
}
}

 结果展示:

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

最新文章

  1. 使用NSAssert()和NSParameterAssert调试程序
  2. [CentOS]安装软件:/lib/ld-linux.so.2: bad ELF interpreter解决
  3. 彻底搞懂Html5本地存储技术(一)
  4. T4模板之初体验(语法)
  5. Mysql学习笔记(九)索引查询优化
  6. HDU 5326 work (回溯,树)
  7. Android Activity四种加载方式
  8. 主机开启后,显示器显示NO SIGNAL,无信号
  9. javascript函数 第14节
  10. Java偏向锁实现原理(Biased Locking)
  11. 【转】Spring源码编译
  12. JSP九大内置对象的作用和用法总结(转)
  13. lombok注解介绍
  14. hihocoder第229周:最大连续字母个数
  15. 5 -- Hibernate的基本用法 --4 5 JNDI数据源的连接属性
  16. mysql timestamp的默认值
  17. leetcode949
  18. js toSting方法实现
  19. [SpringBoot] - 配置文件的多种形式及JSR303数据校验
  20. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何在程序中添加注释

热门文章

  1. CAD保存高版本的dwg(com接口)
  2. mysql中having和where区别?
  3. php观察折模式
  4. GitHub:创建和修改远程仓库
  5. NLTK学习笔记(七):文本信息提取
  6. 编译Openwrt的log
  7. Codeforces 919C - Seat Arrangements
  8. Ch’s gift
  9. hdu 1532&amp;&amp;poj1273 基础最大流
  10. c++ primer 第三章 标准库类型