堆排序(heapsort)

堆排序是一种基于完全二叉树的排序算法,它通过构建大顶堆或小顶堆,将最大或最小值逐步移到数组末尾。算法主要包括构建堆、交换堆顶与末尾元素、重新调整堆的过程,从而实现排序。
摘要由CSDN通过智能技术生成

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。
堆排序的步骤如下:
(1)将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;
(2)将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
(3)重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序

// 堆排序
    public static int[] heapsort(int[] array) {
    //构建大顶堆
        for (int i = array.length / 2 - 1; i >= 0; i--) {
    //从第一个非叶子结点从下至上,从右至左调整结构
            getHeap(array, i, array.length);
        }
    //交换堆顶元素与末尾元素并重新得到大顶堆
        for (int j = array.length - 1; j > 0; j--) {
            //将堆顶元素与末尾元素进行交换
            change(array, 0, j);
            //重新对堆进行调整
            getheap(array, 0, j);
        }
        return array;
    }



    public static void getheap(int[] array, int i, int length) {
        //得到array[i]的值
        int temp = array[i];
        //从i结点的左子结点开始,也就是2i+1处开始
        for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
            //如果只有一个节点直接进行下一步判断,如果左子结点小于右子结点,k指向右子结点
            if (k + 1 < length && array[k] < array[k + 1]) {
                k++;
            }
            //如果子节点大于父节点,将子节点值赋给父节点
            if (array[k] > temp) {
                array[i] = array[k];
                i = k;
            //将原本array[i]的值放到交换后的位置
                array[i] = temp;
            } else {
                break;
            }
        }
        
    }



    public static void change(int[] array, int index1, int index2) {
        int temp = array[index1];
        array[index1] = array[index2];
        array[index2] = temp;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值