记录一下自己实现的堆排序

#include <stdio.h>

/*
*如果父节点的值小于左右孩子中的最大值,则交换父节点的值和左右孩子中的最大值
*/
void heapify(int arr[], int i, int size)
{
    if(i < size){
        int left = 2 * i + 1;//左孩子
        int right = 2 * i + 2;//右孩子
        int largest = i;//父节点

        //找出父节点和左右孩子中的最大值
        if(left < size){
            if(arr[largest] < arr[left])
                largest = left;
        }

        if(right < size){
            if(arr[largest] < arr[right])
                largest = right;
        }

        if(largest != i){

            //如果最大值不是父节点本身,则交换最大值到父节点
            int tmp = arr[i];
            arr[i] = arr[largest];
            arr[largest] = tmp;

            //继续向下一个子树执行该操作
            heapify(arr, largest, size);
        }
    }

    return;
}

/*
*建立最大堆
*当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。
*当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。
*/
void heap_max(int arr[], int size)
{
    int i;
    for(i = size - 1;i >= 0;--i){
        //确保每颗子树的父节点的值是最大的
        heapify(arr, i, size);
    }

    return;
}

/*
*堆排序
*获取最大堆后,交换根节点的值和最后一个值
*/
void heap_sort(int arr[], int size)
{
    int i;
    for(i = size - 1;i >= 0;--i){
        //获取最大堆
        heap_max(arr, i+1);

        //交换根节点的值和最后一个值
        int tmp = arr[i];
        arr[i] = arr[0];
        arr[0] = tmp;

    }

    return;
}

int main(void)
{
    int arr[10] = {12, 22, 33, -9, 1, 90, 29, 93, 88, 10};
    //heap_max(arr, 10);
    heap_sort(arr, 10);

    int i;
    for(i = 0;i < 10;++i)
        printf("%d,", arr[i]);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值