赞
踩
堆排序(Heap Sort)是一种高效的排序算法,利用了堆这种数据结构的特性。堆排序的时间复杂度为 O(n log n),并且是一个原地排序算法,不需要额外的存储空间。
堆是一种特殊的树形数据结构,分为最大堆和最小堆两种类型:
堆排序利用了最大堆的性质来进行升序排序,具体过程如下:
构建最大堆:
堆化数组:
排序:
下面是用C语言实现堆排序的代码示例:
#include <stdio.h> // 交换数组中两个元素的值 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 调整堆,使得以root为根节点的子树满足最大堆的性质 void heapify(int arr[], int n, int root) { int largest = root; // 初始化根节点为最大值 int left = 2 * root + 1; // 左子节点 int right = 2 * root + 2; // 右子节点 // 如果左子节点大于根节点,则更新最大值的索引 if (left < n && arr[left] > arr[largest]) largest = left; // 如果右子节点大于当前的最大值,则更新最大值的索引 if (right < n && arr[right] > arr[largest]) largest = right; // 如果最大值不是根节点,则交换并递归调整堆 if (largest != root) { swap(&arr[root], &arr[largest]); heapify(arr, n, largest); } } // 堆排序函数 void heap_sort(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); } } int main() { int arr[] = {12, 11, 13, 5, 6, 7}; int n = sizeof(arr) / sizeof(arr[0]); printf("排序前:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); heap_sort(arr, n); printf("排序后:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
swap
函数用于交换数组中两个元素的值。heapify
函数用于调整堆,使得以指定根节点为起点的子树满足最大堆的性质。heap_sort
函数首先构建最大堆,然后逐步将堆顶元素(最大值)与堆的末尾元素交换,再重新调整堆,最终完成排序。堆排序的时间复杂度为 O(n log n),空间复杂度为 O(1),是一个原地排序算法,适合处理大规模数据的排序问题。
堆排序利用堆这种数据结构的特性,通过构建最大堆和不断调整堆的过程来实现排序。它的时间复杂度稳定在 O(n log n),并且适用于大数据量的排序需求。通过本文,我们深入了解了堆排序的原理和实现方式,并通过C语言代码展示了如何实现堆排序算法。对于理解高效排序算法和算法设计有着重要的帮助。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。