堆排序

本文介绍了一种基于堆数据结构的高效排序算法——堆排序。详细解释了如何通过维护最大堆来实现数组的升序排列,并提供了完整的堆排序实现代码。

 

 

 

 

堆排序(Heapsort)是指利用堆积树(堆)这种 数据结构所设计的一种 排序算法,它是选择排序的一种。可以利用 数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是 完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即 A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

#include <stdlib.h>

/**

 * 堆排序

 * */

 

void heapify(int arr[], int i, int n)

{

    int l = 2 * i + 1;

    int r = 2 * i + 2;

    int maxIndex = i;

    if (l < n && arr[i] < arr[l])

    {

        maxIndex = l;

    }

    if (r < n && arr[maxIndex] < arr[r])

    {

        maxIndex = r;

    }

    if (maxIndex != i)

    {

        swap(arr, i, maxIndex);

        heapify(arr, maxIndex, n);

    }

}

 

void heapSort(int arr[], int n)

{

    //建堆

    int i;

    for (i = n / 2 - 1; i >= 0; i--)

    {

        heapify(arr, i, n);

    }

    //排序

    for (i = n - 1; i > 0; i--)

    {

        swap(arr, 0, i);

        heapify(arr, 0, i);

    }

}


 

int main(int argc, char **argv)

{

    int arr[] = {34, 2, 1, 4, 353, 32, 53, 4, 534, 46};

    int len = sizeof(arr) / sizeof(int);

    heapSort(arr, len);

    print(arr, len);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值