堆排序

本文深入探讨了堆排序的排序思想、算法实现及性能分析。通过将排序表的记录构建为大顶堆,每次选取堆顶元素作为当前最大(或最小)记录,直至完成排序,展示了堆排序的时间复杂度为O(nlogn),空间复杂度为O(1),并讨论了其不稳定的特性。

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

1 排序思想:

将排序表的n个记录按照关键字建成堆,堆顶元素就是选择出的最大(或最小)记录,这样就得到排序的第一个记录。再将剩下的n-1个记录建成堆,得到次大(或者次小)的记录。如此反复,直到执行n-1次后,排序结束。

大顶堆的性质:R[i]>=R[2i]且R[i]>=R[2i+1]

2 算法实现:

// 堆排序
void heap_sort(int num[], int n){
    int i;
    // 将num[]调整成大顶堆
    // 即num[i]>=num[2i]&&num[i]>=num[2i+1]
    for(i=n/2;i>=0;i--){
        heap_adjust(num,i,n);
    }
    for(i=n-1;i>0;i--){
        // 将每一轮的堆顶放在i
        SWAP(num[0],num[i]);
        // 再将剩下的i个记录调整成大顶堆
        heap_adjust(num,0,i);
    }
}
// 将num[s,q)段调整成大顶堆
// num[s]>=num[2s]且num[s]>=num[2s+1]
void heap_adjust(int num[],int s,int q){
    int rc=num[s];
    int i;
    for(i=2*s;i<q;i*=2){
        if(i<q-1&&num[i]<num[i+1])
            i++;
        if(rc>=num[i])
            break; // rc应当放在位置s
        num[s]=num[i];
        s=i;
    }
    num[s]=rc;
}
#define SWAP(x,y) {int t; t = x; x = y; y = t;}

3 性能分析:

3.1 空间复杂度:O(1)

3.2 时间复杂度:平均和最坏时间复杂度是O(nlogn)

3.3 稳定性:不稳定

转载于:https://my.oschina.net/plumsoft/blog/137295

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值