c语言怎么实现堆排序

   2025-02-15 5780
核心提示:堆排序是一种利用堆数据结构的排序算法,主要的步骤包括:将待排序数组构建成一个大顶堆(或小顶堆),使得每个父节点的值都大于

堆排序是一种利用堆数据结构的排序算法,主要的步骤包括:

将待排序数组构建成一个大顶堆(或小顶堆),使得每个父节点的值都大于(或小于)其左右子节点的值。交换堆顶元素(即数组的第一个元素)和堆末尾元素,然后缩小堆的范围,再次调整堆,使其满足堆的性质。重复步骤2,直到堆的范围缩小到1,排序完成。

以下是C语言实现堆排序的代码:

// 交换两个元素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);    }}

使用示例:

#include <stdio.h>int main() {    int arr[] = { 12, 11, 13, 5, 6, 7 };    int n = sizeof(arr) / sizeof(arr[0]);    heapSort(arr, n);    printf("排序结果:");    for (int i = 0; i < n; i++) {        printf("%d ", arr[i]);    }    return 0;}

输出结果:

排序结果:5 6 7 11 12 13

 
 
更多>同类维修知识
推荐图文
推荐维修知识
点击排行
网站首页  |  关于我们  |  联系方式  |  用户协议  |  隐私政策  |  网站留言