堆排序代码

大根堆

#include <stdio.h>

// 大根堆:

// 建立大根堆
void maxHeapify(int arr[], int n, int i)
{
    int largest = i;       // 初始化最大值的索引为i
    int left = 2 * i + 1;  // 左子节点的索引
    int right = 2 * i + 2; // 右子节点的索引

    // 如果左子节点比根节点大,则更新最大值的索引
    if (left < n && arr[left] > arr[largest])
    {
        largest = left;
    }

    // 如果右子节点比当前最大值大,则更新最大值的索引
    if (right < n && arr[right] > arr[largest])
    {
        largest = right;
    }

    // 如果最大值的索引不等于i,说明发生了交换
    if (largest != i)
    {
        // 交换arr[i]和arr[largest]
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        // 递归调用maxHeapify,确保子树也满足大根堆性质
        maxHeapify(arr, n, largest);
    }
}

// 建立大根堆的函数
void buildMaxHeap(int arr[], int n)
{
    // 从最后一个非叶子节点开始,依次向上调用maxHeapify
    for (int i = n / 2 - 1; i >= 0; i--)
    {
        maxHeapify(arr, n, i);
    }
}

// 堆排序算法
void heapSort(int arr[], int n)
{
    // 首先建立大根堆
    buildMaxHeap(arr, n);
    // 依次将堆顶元素(最大值)与末尾元素交换,并调用maxHeapify维护大根堆性质
    for (int i = n - 1; i > 0; i--)
    {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        maxHeapify(arr, i, 0);
    }
}


小根堆

// 小根堆

// 建立小根堆
void minHeapify(int arr[], int n, int i)
{
    int smallest = i;      // 初始化最小值的索引为i
    int left = 2 * i + 1;  // 左子节点的索引
    int right = 2 * i + 2; // 右子节点的索引

    // 如果左子节点比根节点小,则更新最小值的索引
    if (left < n && arr[left] < arr[smallest])
    {
        smallest = left;
    }

    // 如果右子节点比当前最小值小,则更新最小值的索引
    if (right < n && arr[right] < arr[smallest])
    {
        smallest = right;
    }

    // 如果最小值的索引不等于i,说明发生了交换
    if (smallest != i)
    {
        // 交换arr[i]和arr[smallest]
        int temp = arr[i];
        arr[i] = arr[smallest];
        arr[smallest] = temp;
        // 递归调用minHeapify,确保子树也满足小根堆性质
        minHeapify(arr, n, smallest);
    }
}

// 建立小根堆的函数
void buildMinHeap(int arr[], int n)
{
    // 从最后一个非叶子节点开始,依次向上调用minHeapify
    for (int i = n / 2 - 1; i >= 0; i--)
    {
        minHeapify(arr, n, i);
    }
}

// 堆排序算法
void heapSort(int arr[], int n)
{
    // 首先建立小根堆
    buildMinHeap(arr, n);
    // 依次将堆顶元素(最小值)与末尾元素交换,并调用minHeapify维护小根堆性质
    for (int i = n - 1; i > 0; i--)
    {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        minHeapify(arr, i, 0);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu丶ying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值