堆排序(用了好多的位运算)

本文介绍了一种使用C++实现的堆排序算法。该算法通过构建初始堆并不断调整堆结构来完成排序过程。具体步骤包括:输入数据构建初始堆、调整堆结构保持堆性质以及逐步移除堆顶元素完成排序。

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

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10000;
int a[maxn];
int main(){
    int i,j,k,m=0,n,t;
    scanf("%d",&n);
    int top=1;//模拟堆顶
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);//显然这不用多解释,输入;
        int len=i;
        while(len>1&&a[len]<a[len/2]){//每次输入一个数便将最小数放在堆顶 ;
            swap(a[len],a[len/2]);//如果他的儿子大于它的父亲,便将其交换;
            len/=2;
        }
    }
    m=n;
    for(i=1;i<=n;i++){//将其变为小根堆树;
        printf("%d ",a[1]);
        a[1]=a[m];m--;//将叶子节点放置堆顶往下沉,这是堆排的特性,因为堆的叶子节点是根节点;
        top=1;
        while((a[top]>a[top<<1]&&(top<<1)<=m)||(a[top]>a[top<<1|1]&&((top<<1|1)<=m))){//每次将其交换
            t=(top<<1);
            if(a[t]>a[t+1] &&  t+1<=m)t++;//如果左儿子大于右儿子便将其变成右儿子,便于之后的交换,将最小的永远放置堆顶 ;
            swap(a[top],a[t]);
            top=t;
        }
        qsort("","","""");
        //for(j=1;j<=m;j++)printf("%d ",a[j]);  
        //puts("");//调试程序;
    }
    return 0;
}

转载于:https://www.cnblogs.com/brodrinkwater/p/7528039.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值