堆排序的基本实现

1.堆排序的基本特性
1)稳定性:不稳定
2)平均时间复杂度:O(nlogn)
3)最小时间复杂度:O(nlogn)
4)最大时间复杂度:O(nlogn)
6)空间复杂度:O(1)
2.算法描述:
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序
基本思想:
将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了
3.算法实现:

public static String aaaaaa() {
        long time1=System.nanoTime();
        int[] list = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
        for (int i = list.length / 2; i >= 0; i--) {
            disassembly(list, i, list.length);
        }
        for (int i = list.length - 1; i > 0; i--) {
            // 最后一个元素和第一元素进行交换
            int temp = list[i];
            list[i] = list[0];
            list[0] = temp;

            // 筛选 R[0] 结点,得到i-1个结点的堆
            disassembly(list, 0, i);
        }

        System.out.println(System.nanoTime() - time1);
        for (int i = 0; i < list.length; i++) {
            System.out.print(list[i]+" ");
        }

        System.out.println();

        return "1";
    }

    public static void disassembly(int[] list,int parent,int length){
        int temp = list[parent]; // temp保存当前父节点
        int child = 2 * parent + 1;

        while (child < length) {
            // 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
            if (child + 1 < length && list[child] < list[child + 1]) {
                child++;
            }

            // 如果父结点的值已经大于孩子结点的值,则直接结束
            if (temp >= list[child]){
                break;
            }


            // 把孩子结点的值赋给父结点
            list[parent] = list[child];

            // 选取孩子结点的左孩子结点,继续向下筛选
            parent = child;
            child = 2 * child + 1;
        }

        list[parent] = temp;

    }

4.算法结果:

15212
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50 

5.其他:

  堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆
  大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
  小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值