数据结构-【选择排序】堆排序


    选择排序常见的包括简单选择排序和堆排序。对于堆排序,包括两个核心操作:


    **【1】**大根堆/小根堆的构建。主要涉及到完全二叉树的顺序存储结构表示和相关性质理解,以及堆构建过程中的元素位置调整。
    **【2】**堆排序过程中,删除堆顶元素,并用堆底元素进行补位,接着对剩余的堆中元素进行位置调整。(对于顺序存储结构表示的堆,可以通过下标限制在逻辑上对已输出元素进行“删除”)
        =>更具体的原理就不在此进行赘述了。

1 大根堆的构建与堆中元素位置调整

    这里仅以大根堆构建为例,给出堆构建过程的图解,这也是堆排序算法的核心所在。
在这里插入图片描述

2 堆排序算法的代码实现

/**
     * 堆排序算法实现
     * @param ints
     * @param len
     */
    public static void HeapSort(int[] ints,int len){
        int i,temp;
        ints=BuildMaxHeap(ints,len);
        for (i=len;i>1;i--){
            System.out.println(ints[1]);
            temp=ints[1];
            ints[1]=ints[i];
            ints[i]=temp;
            ints=HeapAdjust(ints,1,i-1);
        }
    }

    /**
     * 建立大根堆
     */
    private static int[] BuildMaxHeap(int[] ints,int len){
        int i;
        for (i=len/2;i>0;i--)
            ints=HeapAdjust(ints,i,len);
        return ints;
    }

    /**
     * 调整子堆
     * @param ints
     * @param k
     * @param len
     */
    private static int[] HeapAdjust(int[] ints, int k, int len) {
        ints[0]=ints[k];//记录子堆根元素
        for (int i=k*2;i<=len;i*=2){
            if (i<len&&ints[i]<ints[i+1])
                i++;
            if (ints[0]>=ints[i]) break;
            else {
                ints[k]=ints[i];
                k=i;
            }
        }//for
        ints[k]=ints[0];
        return ints;
    }

3 堆排序代码测试

 public static void main(String[] args) {
        //2-堆排序
        int[] ints={-1,49,38,65,97,76,13,27,49};
        System.out.println(ints.length-1);
        HeapSort(ints,ints.length-1);
    }

在这里插入图片描述
    最近时间比较紧,后面闲下来之后,可能会将数据结构的线性结构(线性表、栈、队列、串等)和非线性结构(树/图及其应用,普里姆算法、克鲁斯卡尔、Dijkstra算法等)、查找和排序算法等所有内容再进行丰富。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是席木木啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值