堆排序代码实现

参考《大话数据结构》P399
//堆排序的时间复杂度为O(NlogN),在性能上显然远好于冒泡,简单选择,直接插入的O(n²)的时间复杂度
//不过由于记录的比较与交换是跳跃式进行,因此堆排序是一种不稳定的排序方法
/**将该节点及以下的子节点排成一个最大堆*/
void HeapAdjust(int* a, int i, int size){
    int temp;
    int j;
    
    temp = a[i];
    
    for (j = 2*i; j <= size; j*=2)
    {
        if(j<size && a[j]<a[j+1])
        {
            ++j;
        }
        if(temp>=a[j])
        {
            break;
        }
        a[i] = a[j];
        i = j;
    }
    a[i] = temp;
}

/**对数组进行堆排序*/
void HeapSort(int* a, int size)
{
    int i;
    //先将待排序的序列构造成一个大顶堆,堆顶的根节点为最大值
    for (i = size/2; i>0; i--)
    {
        HeapAdjust(a, i, size);
    }
    //将堆顶的值与堆数组末尾的元素交换,将剩下的n-1个序列构造成一个堆
    for(i=size; i>1; i--)//a[0]存放的是“哨兵”
    {
        swap(a[1],a[i]);
        HeapAdjust(a, 1, i-1);
    }

}


堆排序大概就两点:1.先将无序序列的排成最大堆  2.将最大堆的堆顶与末尾交换,剩下的再排成最大堆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值