2022更文挑战17-堆排序

85 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

堆排序

前文

本文为个人对于堆排序相关内容的整理及总结,内容上难免存在不足之处,如果出现不准确的信息还请见谅。

堆排序

堆排序是利用接近二叉树的结构所设计出来的排序算法。显然,该算法会需要通过三步才能完成排序操作。第一部将队列数据转化为一个二叉堆的结构;第二步堆堆结构的内容进行操作,得到一个目标堆结构;最后,将目标堆结构重新转化为队列结构。

由堆结构的定义可以知道,堆排序的核心内容在于如何对于第二步中堆中的数据进行位置调整,得到目标的堆结构。第二步的首先是将第一步所形成的堆结构进行位置调整,形成一个大顶堆。所谓大顶堆,就是堆顶的元素要大于堆每个叶子节点的元素值。经过初步调整后,得到了初始的大顶堆。

对于初始的大顶堆,进行后续的操作。首先将堆尾的元素与堆顶的元素进行交换。由于我们前面已经创造了大顶堆的数据结构,此时最大的元素将会被移动到堆尾。调整后此时将堆尾数据视为不存在,其余元素重新调整为大顶堆。然后再将堆顶元素与堆尾元素进行替换,得到第二大的元素,并重新将余下的堆结构重新调整为大顶堆。以此方式继续执行,直至最后能够将所有元素进行排序。按照上面的方式得到的是从大大小的排序,从小到大的排序以此类推。

看一下堆排序的伪代码:

public static void sort(int[] list){
        for(int i=list.length/2-1; i>=0; i--){
            //调整结构构建大顶堆
        }
        for(int j=list.length-1; j>0; j--){
            //首尾元素交换
            //调整结构构建大顶堆
        }
    }

由于堆排序需要额外的队列存储得到的堆尾数据,因此需要额外的空间,空间复杂度为o(n)。而堆排序的时间复杂度平均为o(nlog2n)。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。