堆排序c语言代码加注释
时间: 2024-09-21 13:13:01 浏览: 48
当然可以,下面是一个简单的堆排序C语言代码示例,带有详细的注释说明:
```c
#include <stdio.h> // 引入头文件
// 定义一个函数用于交换两个元素
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 堆ify操作,维护大顶堆性质
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); // 调整剩余元素为新堆
}
}
// 测试堆排序
int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array:\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
heapSort(arr, n);
printf("\nSorted array:\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
```
在这个代码中,`heapSort`函数实现了堆排序的主要流程,包括构建堆和调整堆的过程。`main`函数用于测试排序功能。注意,这个例子中假设输入数组是正序排列,实际应用中需要先判断是否已经是有序序列。
阅读全文