使用堆排序由小到大排序c语言代码
时间: 2024-10-23 07:13:02 浏览: 32
堆排序是一种基于比较的排序算法,它通过构造最大堆(或最小堆)来达到排序的目的。下面是一个简单的C语言代码示例,展示了如何使用小顶堆实现从数组中从小到大排序:
```c
#include <stdio.h>
#include <stdlib.h>
// 堆结构体
typedef struct {
int data;
int index; // 父节点索引
} Node;
// 比较函数,用于确定是否需要交换元素
int compare(const void *a, const void *b) {
return ((Node *) a)->data - ((Node *) b)->data;
}
// 建立最大堆
void heapify(int arr[], int n, int i) {
Node node = {arr[i], 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) {
// 交换父节点和较大孩子的位置
Node temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
// 继续调整新的根节点
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--) {
// 将堆顶元素(当前最大值)与最后一个元素交换并移除堆顶
Node temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
// 调整剩余堆,保证根部始终是最大值
heapify(arr, i, 0);
}
}
// 测试堆排序
int main() {
int arr[] = {54, 26, 93, 17, 77, 31, 44, 55, 20};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
heapSort(arr, n);
printf("Sorted array (ascending):\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
阅读全文