堆排序(不写怕自己忘了。。。)

本文深入讲解堆排序算法的原理及应用,包括堆的定义、堆排序的时间复杂度、算法步骤及其实现代码。通过实例演示如何使用堆排序对数据进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆排序的运用和算法

堆排序(HeapSort),指利用堆这种数据结构来设计一种排序算法。堆积是一个近似完全二叉树的结构。同时存在最大堆和最小堆两个特殊情况。堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆排序的时间复杂度是(o=nlogn),是一种不稳定的排序方法。

题目描述
编写程序,实现堆排序
输入
记录个数
记录1 记录2 记录3 …,
输出
记录x1 记录x2 记录x3 …
样例输入
10
42 18 35 41 90 65 49 19 53 75
样例输出
18 19 35 41 42 49 53 65 75 90

  • 算法描述
  1. 将初始待排序关键字序列(R1,R2…Rn)构建成一个堆,这个堆位最初始的无序状态。
  2. 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2…Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
  3. 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

在这里插入图片描述

  • 代码实现
//构造最小堆(仅中间一步操作)
void MinHeapFixDown(int a[], int i, int n){
    int j = 2 * i + 1;
    int temp = a[i];
    while(j < n){
        if(j+1<n&&a[j]<a[j+1])
            j++;
        if(temp > a[j])
            break;
        else{
            a[i]=a[j];
            i=j;
            j=2*i+1;
        }
    }
    a[i]=temp;
}
//n为数组长度(默认数组从0号位开始存储)
void HeapSort(int a[], int n){
    for(int i= n/2-1;i>=0;i--)
        MinHeapFixDown(a,i,n);
    for(int i=n-1;i>=1;i--){
        swap(a[i],a[0]);
        MinHeapFixDown(a,0,i);
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值