【算法】堆排序

堆排序是建立在堆这种数据结构上的一种排序算法,是选择排序的一种。
堆排序的思想是:利用最大堆(或最小堆)输出堆顶元素,即最大值(或最小值),再将剩下的元素重新生成最大堆(或最小堆),继续输出堆顶元素,重复此过程,直到全部元素都被输出,得到的输出序列就是有序序列。
很显然,堆排序算法的实现只需要借助之前的博文中提到的堆的建立和删除算法即可完成。
我们可以新建一个数组用于存放输出序列,不过这样太过麻烦。我们只需每次将输出的堆顶元素与堆中最后一个元素交换并将堆的大小减一即可,所以为了得到增序序列,需要建立最大堆。

下面给出代码:
由于建立最大堆和删除堆顶元素的过程都需要进行向下过滤调整,所以将这一过程单独拿出来写成函数Ajust()。

void Adjust(int *a, int i, int n)
{
    //对数组a的前n个元素,从元素i开始向下迁移调整
    int parent,child,temp;
    parent = i;
    temp = a[i];
    while((parent*2+1) <= (n-1)){
        child = parent*2+1;
        if((child != n-1)&&(a[child] < a[child+1]))
            child++;  //child指向两个子结点中较大的那个
        if(temp >= a[child])
            break;
        else{
            a[parent] = a[child];//将child元素移动到父节点的位置
            parent = child;//parent指向下一层较大的结点
        }
    }
    a[parent] = temp;//将temp放到当前位置
}

void HeapSort(int *a, int n)
{
    int temp;
    for(int i = (n-2)/2; i>=0; i--)
        Adjust(a,i,n); //建立最大堆
    for(int i = n-1; i>0; i--){
        temp = a[i];
        a[i] = a[0];
        a[0] = temp; //将堆中第一个和最后一个元素换位
        Adjust(a, 0, i); //从有i个结点的新堆的根结点开始向下过滤调整
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值