排序算法_3,堆排序2

11 篇文章 0 订阅
#include <stdio.h>

int h[15] = {0,99,5,36,7,22,17,46,12,2,19,25,28,1,92}; //堆数组,h[0]不在计算范围内,不是堆里的元素,请忽略
int n = 14;      //堆元素个数

//两数交换函数
void swap(int *x, int *y){
    int t;
    t = *x;
    *x = *y;
    *y = t;
}

//向下调整节点i
void siftdown(int i){
    //节点i还有子节点时
    while (i*2<=n){
        int t = i;
        //当小于左节点时
        if (h[i] < h[i*2])
            t = i*2;
        else
            t = i;
        //如果还有右子节点
        if (i*2+1 <= n)
            if (h[t] < h[i*2+1])
                t = i*2+1;
        //如果发现t已经不是i,交换两数,否则已满足最大堆条件,跳出循环
        if (t != i){
            swap(&h[i], &h[t]);
            i = t;
        } else
            break;

    }
}

//创建最大堆
void createMaxHeap() {
    //从最后一个非叶节点开始
    int i;
    for (i = n / 2; i >= 1; --i)
        siftdown(i);
}

//堆排序
void heapSort(){
    while (n>1){
        //此时h[1]肯定是最大的(因为已经生成了最大堆),与堆末尾交换
        swap(&h[1], &h[n]);
        n--;
        siftdown(1);
    }
}

void main() {
    //排序前输出一次
    printf("start:\n");
    for (int i = 1; i <= n ; ++i) {
        printf("%3d", h[i]);
    }
    //生成最大堆
    createMaxHeap();
    //进行堆排序
    heapSort();
    //输出排序后的结果
    printf("\n");
    for (int i = 1; i <= 14 ; ++i) {
        printf("%3d", h[i]);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值