超详细!新手也能看懂的 C 语言堆排序代码及边界、递归处理解析
```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 buildHeap(int arr[], int n) { // 从最后一个非叶子节点开始向上调整 for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } } // 堆排序 void heapSort(int arr[], int n) { // 构建大顶堆 buildHeap(arr, n); // 一个个从堆顶取出元素 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); } ``` ### 额外需要注意的逻辑点 1. **边界条件**:确保在 `heapify` 函数中正确处理边界条件,避免数组越界。 2. **递归调用**:在 `heapify` 中递归调用时,确保每次调用都传递正确的参数,特别是子树的大小。 3. **初始化**:在 `buildHeap` 函数中,从最后一个非叶子节点开始向上调整,确保整个数组形成一个大顶堆。 ######[AI写代码神器 | 674点数解答 | 2024-11-23 16:52:14]
- Matlab编程:血管机器人订购与生物学习,实现104周运营成本最低方案(字节豆包 | 3384点数解答 | 2025-06-22 13:25:13)197
- 6种排序算法完整实现:自行编码、复杂度分析与运行时间对比(字节豆包 | 859点数解答 | 2025-01-10 13:19:29)148
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)274
- Golang开发:解析JSON数据时数值默认类型及示例解析(百度文心 | 393点数解答 | 2023-11-09 18:13:06)312
- SQL Working Areas Sizing: Manual vs. Automatic Policy - A Comprehensive Analysis(阿里通义 | 530点数解答 | 2024-05-13 10:55:58)331
- CentOS下Java进程出现futex_wait_queue_me问题的处理全流程(阿里通义 | 283点数解答 | 2023-11-20 14:51:26)489
- 替雷利珠单抗致免疫相关性糖尿病:病例报道与机制探讨,为临床用药敲响警钟( | 164点数解答 | 2024-10-11 14:52:52)291
- Python 代码转 C++:计算花朵鲜艳值总和(字节豆包 | 408点数解答 | 2026-04-19 21:50:57)21
- Python 实现:带边界处理与验证的任意基数数字转换递归程序(字节豆包 | 198点数解答 | 2024-11-21 14:20:25)459
- Python 递归函数实现:将数字转换为指定基数的输出(百度文心 | 499点数解答 | 2024-11-22 09:58:55)357
- 编程模拟:偶数张牌经 k 次洗牌后第 p 张牌编号求解(DeepSeek | 126点数解答 | 2026-01-05 12:15:30)46
- 螺旋矩阵:根据输入行列号精准求出对应位置数字的算法揭秘(DeepSeek | 740点数解答 | 2026-01-05 12:16:41)68