温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言数据结构堆排序示例分析

发布时间:2022-05-11 09:53:47 阅读:151 作者:iii 栏目:开发技术
C语言开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

C语言数据结构堆排序示例分析

堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法。它通过构建一个最大堆(或最小堆)来实现排序,具有时间复杂度为O(n log n)的特点,适用于大规模数据的排序。本文将详细介绍堆排序的原理,并通过C语言代码示例进行分析。

1. 堆排序的基本概念

1.1 二叉堆

二叉堆是一种特殊的完全二叉树,它满足以下性质: - 最大堆:每个节点的值都大于或等于其子节点的值。 - 最小堆:每个节点的值都小于或等于其子节点的值。

堆排序通常使用最大堆来实现升序排序。

1.2 堆排序的步骤

堆排序的主要步骤如下: 1. 构建最大堆:将待排序的数组构建成一个最大堆。 2. 交换堆顶元素:将堆顶元素(最大值)与数组的最后一个元素交换,然后将剩余的元素重新调整为最大堆。 3. 重复步骤2:重复上述过程,直到所有元素都排序完成。

2. C语言实现堆排序

2.1 代码实现

#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 n) {
    for (int i = 0; i < n; 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;
}

2.2 代码分析

  1. swap函数:用于交换两个元素的值。
  2. heapify函数:用于调整堆,使其满足最大堆的性质。该函数通过递归的方式确保每个子树都满足最大堆的性质。
  3. heapSort函数:首先构建最大堆,然后通过不断交换堆顶元素和数组末尾元素,并调整堆,最终实现排序。
  4. printArray函数:用于打印数组内容。

2.3 运行结果

原始数组: 
12 11 13 5 6 7 
排序后的数组: 
5 6 7 11 12 13 

3. 堆排序的时间复杂度分析

  • 构建最大堆:O(n)
  • 每次调整堆:O(log n)
  • 总时间复杂度:O(n log n)

堆排序的时间复杂度为O(n log n),且它是一种原地排序算法,不需要额外的存储空间。

4. 总结

堆排序是一种高效的排序算法,尤其适用于大规模数据的排序。通过构建最大堆并不断调整堆结构,堆排序能够在O(n log n)的时间复杂度内完成排序任务。本文通过C语言代码示例详细介绍了堆排序的实现过程,并分析了其时间复杂度。希望本文能帮助读者更好地理解堆排序的原理和应用。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×