当前位置:首页C语言 > 正文

c语言堆排序

作者:野牛程序员:2024-01-03 21:31:20C语言阅读 2623

堆排序是一种基于二叉堆数据结构的排序算法。以下是用C语言实现的堆排序示例代码:

#include <stdio.h>

// 交换两个元素的值
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 调整堆,使其满足堆的性质
void heapify(int arr[], int n, int i) {
    int largest = 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;
    }

    // 如果最大值索引不是父节点,则交换父节点和最大值节点,并递归调整堆
    if (largest != i) {
        swap(&arr[i], &arr[largest]);
        heapify(arr, n, largest);
    }
}

// 堆排序函数
void heapSort(int arr[], int n) {
    // 构建最大堆
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }

    // 一个一个从堆顶取出元素
    for (int i = n - 1; i > 0; i--) {
        // 将当前最大元素移到数组末尾
        swap(&arr[0], &arr[i]);

        // 重新调整剩余堆
        heapify(arr, i, 0);
    }
}

// 打印数组元素
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\\n");
}

// 示例
int main() {
    int arr[] = {12, 11, 13, 5, 6, 7};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原始数组: \\n");
    printArray(arr, n);

    heapSort(arr, n);

    printf("排序后的数组: \\n");
    printArray(arr, n);

    return 0;
}

这段代码实现了堆排序算法,包括堆的构建和排序过程。

野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击