c语言实现小根堆排序
时间: 2023-11-25 11:08:45 浏览: 98
以下是C语言实现小根堆排序的代码和解释:
```c
#include <stdio.h>
// 定义交换函数
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 定义小根堆向下调整函数
void adjustDown(int arr[], int n, int i) {
int child = 2 * i + 1; // 左孩子节点
int temp = arr[i]; // 当前节点
while (child <= n) {
if (child + 1 <= n && arr[child] > arr[child + 1]) {
child++; // 找到左右孩子节点中较小的一个
}
if (temp <= arr[child]) {
break; // 如果当前节点小于等于左右孩子节点中较小的一个,退出循环
}
arr[i] = arr[child]; // 将较小的孩子节点上移
i = child; // 更新当前节点和左孩子节点
child = 2 * i + 1;
}
arr[i] = temp; // 将当前节点放到最终位置
}
// 定义小根堆排序函数
void heapSort(int arr[], int n) {
// 构建小根堆
for (int i = n / 2 - 1; i >= 0; i--) {
adjustDown(arr, n - 1, i);
}
// 依次取出堆顶元素并调整堆
for (int i = n - 1; i > 0; i--) {
swap(&arr[0], &arr[i]);
adjustDown(arr, i - 1, 0);
}
}
// 测试
int main() {
int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
int n = sizeof(arr) / sizeof(int);
heapSort(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
阅读全文