构造小根堆,并从大到小排序,C语言
时间: 2024-11-15 18:31:45 浏览: 16
构造小根堆并从大到小排序的过程可以用C语言中的优先队列和数组实现。这里是一个简单的例子:
首先,我们需要定义一个结构体来存储元素及其对应的值,假设叫做`struct Node`。
```c
typedef struct Node {
int value;
int index; // 用于保存原数组中的索引,以便还原顺序
} Node;
```
然后,创建一个函数来维护小根堆的性质,也就是最小堆。这个函数通常被称为`heapify_down`,会遍历从最后一个非叶子节点开始,将每个父节点调整到满足最小堆条件的状态。
```c
void heapify_down(Node heap[], int size, int i) {
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < size && heap[left].value > heap[largest].value)
largest = left;
if (right < size && heap[right].value > heap[largest].value)
largest = right;
if (largest != i) {
swap(&heap[i], &heap[largest]); // 交换元素
// 递归地向下调整较大的孩子
heapify_down(heap, size, largest);
}
}
```
接下来,我们有主函数来构建小根堆(初始时,所有元素都是叶子节点,所以不需要调用`heapify_down`),然后进行一次反向的堆化过程(从根节点开始,保证最大元素始终在顶部):
```c
void build_max_heap(Node heap[], int n) {
for (int i = n / 2 - 1; i >= 0; i--)
heapify_down(heap, n, i);
}
void sort_descending(Node heap[], int n) {
build_max_heap(heap, n); // 构建最大堆
for (int i = n - 1; i > 0; i--) {
swap(&heap[0], &heap[i]); // 将最大元素放到底部
heap[n - 1] = heap[i]; // 更新最大堆顶
heapify_down(heap, i, 0); // 调整新的堆顶
}
}
```
最后,你可以通过创建一个包含待排序元素的数组,调用上述`sort_descending`函数来完成整个排序过程。
```c
// 示例:
Node arr[] = {5, 3, 9, 1, 7};
int n = sizeof(arr) / sizeof(arr[0]);
sort_descending(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i].value); // 输出从大到小的排序结果
}
```
阅读全文