最小堆排序(c语言版
时间: 2024-10-12 13:00:57 浏览: 33
最小堆排序是一种基于比较的排序算法,它利用了堆这种数据结构的特点来完成排序。在C语言中,我们通常会首先将待排序的数据构建成一个二叉堆,这个堆是一个完全二叉树,并满足“父节点的值小于等于其子节点”的性质(对于最大堆则是大于等于)。然后我们反复从堆顶取出最小元素,将其放到已排序部分的末尾,同时对剩余部分调整成新的堆。
以下是简单的C语言版本实现步骤:
1. 创建一个最小堆函数,用于维护数组元素的堆结构。
2. 主函数中,先将整个数组构造成一个堆。
3. 取出堆顶元素(即当前最小元素),并把它与最后一个元素交换位置。
4. 删除最后一个元素后,重新调整堆(缩小范围到剩余元素)。
5. 重复步骤3和4,直到堆只剩下一个元素,排序完成。
```c
#include <stdio.h>
#include <stdlib.h>
// 创建大顶堆
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 swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
// 对数组进行堆排序
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]);
heapSort(arr, n);
printf("Sorted array is \n");
for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
return 0;
}
阅读全文