堆排序的C++代码实现

//交换位于i和j处的值
void exchange(int *a,int i,int j)
{
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}
//保持最大堆的特性
void max_heapify(int *a,int i,int length)
{
    int l = i*2+1;//求左孩子结点,由于数据是从0开始计数,故需要乘以2加1
    int r = (i+1)*2;//求右孩子结点
    int largest = i;
    if (l<=length&&a[l]>a[i])
    {
        largest = l;
    }
    if (r<=length&&a[r]>a[largest])
    {
        largest = r;
    }
    if (largest != i)
    {
        exchange(a,i,largest);
        max_heapify(a,largest,length);//递归使子结点满足最大堆的特性
    }
}
void heap_sort(int *a,int len)
{
    int length = len-1; //由于C++的下标是从0开始,故长度在原有的长度上-1
    int i;
    for (i = length/2;i>=0;i--) //从叶结点开始,创建最大堆
    {
        max_heapify(a,i,length);
    }
    for (i = length;i>0;i--) //根据最大堆进行排序
    {
        exchange(a,0,i);
        max_heapify(a,0,i-1);
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值