堆排序代码解析(堆排序的算法及代码实现)

目前这个系列的文章都挑着非常经典的,让人眼前一亮的算法,今天的堆排序算法就是其中一个。 首先理解什么是堆,这里面堆(Heap)并不是程序中内存区域,而是一种完全二叉树表示的数据结构。 堆具有以下特点

  • 是一个完全二叉树
  • 堆的每个节点的值必须大于等于左右树节点(大顶堆),或小于等于左右树节点(小顶堆)。

简单说明下,完全二叉树是除了最后一层叶子节点外,其他的节点都有两个子树,而叶子节点可以没有子树,或者只有左子树。 如下图就是个大顶堆:

堆排序代码解析(堆排序的算法及代码实现)
堆排序代码解析(堆排序的算法及代码实现)

小顶堆

堆排序代码解析(堆排序的算法及代码实现)

堆存储

堆因为是完全二叉树,非常适合用数组存储,上图为大顶堆的存储情况,其中a[0]不用, a[1]为大顶堆的顶点,也就是最大的数据,a[12]= 7 为左子树顶点,a[12+1]= 6为右子树的顶点,其他节点情况依次类推。

堆的两种操作
向堆插入元素

用图来表示如下:

堆排序代码解析(堆排序的算法及代码实现)

向堆插入元素,先插入到最后一个数组元素位置,然后和自己的父节点6比较,由于比6大不满足大顶堆的条件,所以9和6交换,然后9再和堆顶元素8比较,又不满足大顶堆条件,继续交换,最后形成一个大顶堆,这个步骤叫堆化。

删除堆顶元素

对于大顶堆来说,堆顶的元素为最大值,依次删除堆顶元素并输出,那么就是将数字从大向小排列了。

这里面又个技巧,就是删除堆顶元素的时候,不能直接删除,要用堆顶元素和最后一个元素做交换,然后根据堆的特点调整堆,直到满足条件。

堆排序代码解析(堆排序的算法及代码实现)

完整代码如下:

package com.dianneng.lms;

public class TestHeap {
    private int [] a;
    private int n;
    private int count;

    public TestHeap(int cap) {
        a = new int[cap+1];
        n = cap;
        count = 0;
    }

    public void swap(int i,int j) {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
        return;
    }

    public void print(){
        for (int i = 0; i 0 && a[i] > a[i/2]) {
                swap(i,i/2);
                i = i/2;
            }
        }
        return 0;
    }

    public int  removeMax() {
        if (count == 0)  {
            return -1;
        }
        System.out.print(a[1]+"t");
        a[1] = a[count];
        --count;
        heapify(count,1);
        return 0;
    }

    private void heapify(int n, int i) {
        while(true) {
            int maxPos = i;
            //通过左右子树顶点比较获得最大数节点
            if (i*2 

可以利用大顶堆的特性,对要排序的数组进行先堆化排序,然后依次交换堆顶元素和最后一个元素,交换后堆化,将堆的大小减一,最终这样输出的就是从小到大排序的数组。 借用老师的一个图表示:

堆排序代码解析(堆排序的算法及代码实现)

秒鲨号所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈!本站将在三个工作日内改正。
(0)

大家都在看

  • 国产手机排名前几的是哪些(最新国产手机排名)

    以出货量来排名的话,国内四大手机厂商分别是小米、OPPO、ViVO以及华为,而如今它们已经相继发布了旗下最顶级的旗舰手机,分别是华为Mate40 Pro、小米11UItra、viv…

    2022年2月24日 投稿
  • 信用卡申请需要什么条件(哪家信用卡申请容易过)

    信用卡已经成为了大众主流消费之一,很多年轻人都习惯性使用信用卡提前消费,然而有部分刚入社会的大学毕业生对办理信用卡的条件还不太了解,那么申办信用卡需要什么条件?下面我们一起来看看申…

    2022年6月2日
  • 中央军委成员,中央军委巡视组举报电话是多

      中央近期派出的10个巡视组联系方式汇总 中央第一巡视组 进驻单位中央军委成员:中储粮总公司 进驻时间:5月27日 组长:刘伟 通信地址:北京市海淀区中关村南大街1号100086…

    2022年6月4日
  • 电影播放器品牌排行榜前十名(全网最火排行榜)

    1.爱奇艺下载次数:26亿 2.优酷下载次数:20亿 3.抖音下载次数:6.6亿 4.快手下载次数:22亿 5.腾讯视频下载次数:51亿 6.芒果TV下载次数:3.4亿 7.影视大…

    2022年3月5日 投稿
  • 如何练腹肌(如何练腹肌最快最有效 中学生)

    原创内容,擅自搬运者必究! 平坦的小腹上面,有清晰的肌肉线条,这样的身材是非常吸引人的。不过,这样的身材不是你想要就能拥有的。 好身材离不开平时的自律,你除了需要保持健康饮食外,还…

    2022年6月8日 投稿
  • 中国汽车销量排行榜(中国品牌汽车销量排行榜)

    导读:近日,各大国产车品牌陆续公布了2021年年度销量报告,其中长安汽车以175万辆夺得国产车销量冠军,吉利汽车和长城汽车也都突破了百万,奇瑞汽车和比亚迪汽车也都发挥爆表,上汽旗下…

    2022年6月21日 投稿
  • 七座车型排行榜(7人座家用车哪款最好)

    一直以来,如果想要选购一款7座SUV,那么广汽丰田汉兰达必在考虑的范围内。凭借“舒适”、“皮实耐用”、“空间大”等优点,汉兰达多年来积攒下良好的口碑,销量也自然是非常可观,加价购车…

    2022年3月11日 投稿
  • 加密的压缩包怎么破解(5分钟教你破解加密压缩包)

    一、背景介绍 在我们日常使用计算机办公或者是在互联网下载的一些资源的时候往往会遇到一些不知道加密的而且你不知道压缩包密码的文件,往往我们可能还是比较着急地需要那份文件的,那么我们如…

    2022年2月26日 投稿
  • 如何煮鸡蛋(如何煮鸡蛋不会裂开)

    煮鸡蛋,到底冷水还是热水下锅?教你正确做法,又香又嫩又好剥皮! 鸡蛋的营养价值很高,能为人体补充充足的营养。水煮蛋是我们早餐经常吃的,早餐吃一个鸡蛋、喝一杯奶,就会一上午都元气满满…

    2022年6月15日 投稿
  • 民间风俗(一种民间文化)

    图文摘自网络(如有侵权,请联系删除) 民俗是指一个民族或一个社会群体在长期的生产实践和社会生活中逐渐形成并世代相传、较为稳定的文化事项,我国是一个具有悠久历史民俗传统的国家,在中国…

    2022年8月22日 投稿
品牌推广 在线咨询
返回顶部