C语言堆排序完整代码
时间: 2024-06-03 08:05:55 浏览: 100
C语言:堆排序(内附代码和思路).docx
C语言的堆排序实现主要分为两个部分:建堆和排序。
建堆过程:
1. 首先将待排序数组构建为一个大根堆,从最后一个非叶子节点开始,依次将该节点和其子树调整为大根堆,直到根节点。
2. 这样就得到了一个大根堆,根节点的值即为数组中的最大值。
排序过程:
1. 将根节点的值与数组的最后一个元素交换,这样最大值就被放到了数组的末尾。
2. 然后将剩余元素重新构建为大根堆,重复以上步骤,直到所有元素都有序。
下面是C语言的完整代码:
```
#include <stdio.h>
// 调整堆
void adjustHeap(int arr[], int i, int len) {
int temp = arr[i];
for (int k = 2 * i + 1; k < len; k = 2 * k + 1) {
if (k + 1 < len && arr[k] < arr[k + 1]) {
k++;
}
if (arr[k] > temp) {
arr[i] = arr[k];
i = k;
} else {
break;
}
}
arr[i] = temp;
}
// 堆排序
void heapSort(int arr[], int len) {
// 构建大根堆
for (int i = len / 2 - 1; i >= 0; i--) {
adjustHeap(arr, i, len);
}
// 排序
for (int i = len - 1; i > 0; i--) {
int temp = arr;
arr = arr[i];
arr[i] = temp;
adjustHeap(arr, 0, i);
}
}
int main() {
int arr[] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};
int len = sizeof(arr) / sizeof(int);
heapSort(arr, len);
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
阅读全文