堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:

Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]

即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。

堆分为大顶堆和小顶堆:

                  

大顶堆                                                                                小顶堆
算法思想(以大顶堆为例):
1.将长度为n的待排序的数组进行堆有序化构造成一个大顶堆(将数组--》转化为一个大顶堆)
 
2.将根节点与尾节点交换并输出此时的尾节点(交换节点)
 
3.将剩余的n -1个节点重新进行堆有序化(交换节点后继续有序化)
 
4.重复步骤2,步骤3直至构造成一个有序序列(重复2,3步骤)
 
假设待排序数组为[20,50,10,30,70,20,80]

具体程序实现:

public class HeapSort {
    private static void heapSort(int[] arr) {
        int len = arr.length -1;    //记得-1
        for(int i = len/2 1; i >=0; i --){ //堆构造,将数组转换为大顶堆
            heapAdjust(arr,i,len);
        }
        while (len >=0){
            swap(arr,0,len--);    //将堆顶元素与尾节点交换后,长度减1,尾元素最大
            heapAdjust(arr,0,len);    //,别忘了这一步,再次对堆进行调整
        }
    }
public static  void heapAdjust(int[] arr,int i,int len){
    int left,right,j ;
    while((left = 2*i+1) <= len){    //判断当前父节点有无左节点(即有无孩子节点,left为左节点)(注意是左节点,而不是右节点,下面才是右节点)
        right = left + 1;          //右节点
        j = left;                   //j"指针指向左节点"
        if(j < len && arr[left] < arr[right])    //判断右节点是否存在并且是否右节点大于左节点
            j ++;     //当前把"指针"指向右节点====》下一行的巧妙处理,j不加1,则是与左节点比较,加一则是与右节点比较
        if(arr[i] < arr[j])    //将父节点与孩子节点交换(如果上面if为真,则arr[j]为右节点,如果为假arr[j]则为左节点)
            swap(arr,i,j);
        else         //说明比孩子节点都大,直接跳出循环语句
            break;
        i = j;        // 子节点与父节点交换位置后,要重新进行堆调整,故将j的值赋予i;
    }
}
    public static  void swap(int[] arr,int i,int len){//交换两个数
             int temp = arr[i];
              arr[i] = arr[len];
             arr[len] = temp;
    }
    public static void main(String[] args) {//测试部分
        int array[] = {20,50,20,40,70,10,80,30,60};
        System.out.println("排序之前:");
        for(int element : array){
            System.out.print(element+" ");
        }
        heapSort(array);
        System.out.println("\n排序之后:");
        for(int element : array){
            System.out.print(element+" ");
        }
    }
}

看完不懂可参考https://www.cnblogs.com/MOBIN/p/5374217.html

排序算法值--堆排序相关推荐

  1. Java常见排序算法之堆排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  2. 排序算法之---堆排序(很重要的一个结构,新手入门必备)

    排序算法之---堆排序(很重要的一个结构,新手入门必备) 先来简单的介绍一下堆结构: 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlo ...

  3. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

  4. 排序算法(6)堆排序

    排序算法(6)堆排序---选择排序的高级版 思想:利用数据结构堆的思想来排序,堆排序利用了大堆(或小堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序的序列中选择关键最大(或最小)的记录变得简单 ...

  5. 十大排序算法之堆排序

    十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...

  6. 数据结构与算法:十大排序算法之堆排序

    数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...

  7. 常用排序算法之——堆排序

    堆与堆排序的原理,参考该博客: 白话经典算法系列之七 堆与堆排序 二叉堆是个完全二叉树,可以用一个数组来保存节点,不会浪费空间,能快速定位:本人用一个vector来代替数组,省去自己对内存的分配/重分 ...

  8. C/C++排序算法(6)堆排序

    常见排序算法总结(6)堆排序 一篇文章,带你搞懂 堆排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! 堆排序的时间复杂度O(N*logN),额外空间复杂度O(1),是 ...

  9. 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度-Go语言中文社区...

    堆排序是由1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap ...

最新文章

  1. RNN,LSTM,GRU简单图解:
  2. 独家 | 展望未来:数据科学、数据工程及技术(附链接)
  3. vscode新建html,没有模板
  4. 真正完美攻略之星月夜~Seven Tales in Spiral(中国同人文字AVG)
  5. 【Python刷题】_8
  6. dw项目符号空心圆怎么设置_项目规范配置之editorconfigamp;prettier
  7. 再见xx网盘!4 行命令搭建属于你的私人网盘!
  8. FFMPEG结构体分析之AVFormatContext
  9. python书写风格_以下两种风格 Python 写法,请问大家倾向哪种:)
  10. 第 10 章 容器监控 - 085 - 如何快速部署 Prometheus?
  11. Mac上的IDEA安装配置maven
  12. 聊天宝解散,多闪、马桶MT还会远吗?| 畅言
  13. 微型计算机的输出有,微型计算机必不可少的输入/输出设备是()。 - 百科题库网...
  14. java2wsdl_Axis2用法:JAVA2WSDL和WSDL2JAVA
  15. 定时器 Corn时间表达式
  16. UML 类图画法规则
  17. linux wqy字体安装,给openSUSE安装文泉驿字体
  18. win7计算机序列号怎么查,怎么查看win7序列号
  19. linux 多线程编程-互斥锁问题之tpp.c:63: __pthread_tpp_change_priority failed 问题解决
  20. 「GoTeam 招聘时间」传音移动互联 容器开发(上海)

热门文章

  1. next和hasnext_使用Java中的next()和hasNext()方法遍历List元素
  2. 7 种分布式全局 ID 生成策略,你更爱哪种?
  3. Redis笔记之基本数据结构 动态字符串SDS
  4. Oracle 的 char number varchar2 效率测试
  5. Python爬虫淘宝商品详情页价格、类似数据
  6. mysql 导入导出脚本_MySQL导入和导出sql脚本
  7. Undefined control sequence. \makecover
  8. unity塔防游戏怪物转向_红包版塔防游戏合集-可以赚钱领红包的塔防游戏-无广告塔防游戏红包版大全...
  9. python通过内置函数测试对象类型_Python的内置函数
  10. java abs前缀变量_JAVA工具例大全--cn.hutool.setting.AbsSetting读取配置文件例子