八大排序之——堆排序

堆排序是一种基于二叉树数据结构的排序算法,通过构建大顶堆,将最大值放到末尾,然后重新构建堆,直到所有元素排序完成。其时间复杂度为O(nlogn),空间复杂度为O(1),具有高效且稳定的特点。然而,堆的维护在数据频繁变动时较为繁琐,导致在实际应用中不如快速排序常见。文章详细介绍了堆排序的步骤、优缺点,并给出了具体的过程解析和源代码。
摘要由CSDN通过智能技术生成


一、算法思想

堆排序是基于二叉树数据结构完成的。
首先,将连续的数组视为一个完全二叉树。

①将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的②根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将③剩余n-1个元素重新构造成一个堆,这样会得到n-1个元素的最大值,也就是n个元素的次大值。如此反复执行,便能得到一个有序序列了。


二、堆排序的优缺点

优点:

  1. 堆排序的效率与快排、归并相同,都达到了基于比较的排序算法效率的峰值(时间复杂度为O(nlogn))
  2. 除了高效之外,最大的亮点就是只需要O(1)的辅助空间了,既最高效率又最节省空间,只此一家了
  3. 堆排序效率相对稳定,不像快排在最坏情况下时间复杂度会变成O(n^2)),所以无论待排序序列是否有序,堆排序的效率都是O(nlogn)不变(注意这里的稳定特指平均时间复杂度=最坏时间复杂度,不是那个“稳定”,因为堆排序本身是不稳定的)

缺点:(从上面看,堆排序几乎是完美的,那么为什么最常用的内部排序算法是快排而不是堆排序呢?)
最大的也是唯一的缺点就是——堆的维护问题,实际场景中的数据是频繁发生变动的,而对于待排序序列的每次更新(增,删,改),我们都要重新做一遍堆的维护,以保证其特性,这在大多数情况下都是没有必要的。(所以快排成为了实际应用中的老大,而堆排序只能在算法书里面顶着光环,当然这么说有些过分了,当数据更新不很频繁的时候,当然堆排序更好些…)

三、源代码

import java.util.Arrays;
import java.util.Random;

/**
 * Created by chengxiao on 2016/12/17.
 * 堆排序demo
 */
public class HeapSort {
   
    public static void main(String[] args) {
   
//        int[] arr = {65, 80, 12, 23, 67, 49, 27};
        int[] arr=new int[new Random().nextInt(9)+1];
        for (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值