挑战七大排序算法-04堆排序

23 篇文章 0 订阅
15 篇文章 0 订阅
本文介绍了堆排序的基本原理,包括大顶堆和小顶堆的概念,以及升序和降序排序的应用。堆排序的核心思路是构建堆并进行交换操作,确保每次都将最大元素放到正确位置。接着,文章探讨了堆排序的时间复杂度为O(nlogn)和空间复杂度为O(1),并指出该算法是不稳定的。
摘要由CSDN通过智能技术生成

目录

堆排序

1.原理

2.实现

3.性能分析


堆排序

1.原理

基本原理也是选择排序,只是不再使用遍历的方式查找无序区间的最大数,而是通过堆来选择无序区间的最大数

升序:大顶堆;降序:小顶堆

堆排序的基本思路:

a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;

b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;

c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

2.实现

//堆排序
    public void heapSort(int[] array){
        createHeap(array);
        for (int i = 0;i < array.length-1;i++){
            swap(array,0,array.length-1-i);
            SiftDown(array,array.length-1-i,0);
        }
    }
​
    private void createHeap(int[] array){
        for (int i = (array.length-1)/2;i >= 0;i++){
            SiftDown(array,array.length,0);
        }
    }
​
    private void SiftDown(int[] array,int size,int index){
        int e = array[index];
        while (2*index + 1 < size){
            int j = 2*index + 1;
            //该节点有右孩子,并且右孩子大于左孩子的值
            if (j+1 < size && array[j+1] > array[j]){
                j++;
            }
            //该节点大于孩子值
            if(e > array[j]){
                break;
            }
            swap(array,index,j);//保持该点为其左右子树的最大值
            index = j;
        }
    }

3.性能分析

1.时间复杂度

O(nlogn)

2.空间复杂度

O(1)

3.稳定性?

不稳定

参考博客:https://www.cnblogs.com/chengxiao/p/6129630.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值