用c实现:对10个不重复正整数用堆排序实现从小到大排序
时间: 2024-12-18 08:23:04 浏览: 27
在C语言中,我们可以使用二叉堆数据结构来实现堆排序算法对10个不重复正整数进行排序。以下是堆排序的基本步骤:
首先,我们需要创建一个最小堆,它是一个满足父节点值小于或等于子节点值的完全二叉树。然后,我们将堆顶元素(当前最大值)与最后一个元素交换,将堆大小减一,并调整剩余堆元素使之恢复为最小堆。
```c
#include <stdio.h>
#include <stdlib.h>
// 堆结构体
typedef struct {
int data;
int index; // 索引用于保存原数组位置
} HeapNode;
// 判断是否需要交换
int should_swap(HeapNode a, HeapNode b) {
return a.data > b.data;
}
// 建堆函数
void heapify(int arr[], int n, int i) {
HeapNode node = {arr[i], i};
int largest = i, left = 2 * i + 1, right = 2 * i + 2;
if (left < n && should_swap(arr[node.index], arr[left])) {
largest = left;
}
if (right < n && should_swap(arr[largest], arr[right])) {
largest = right;
}
if (largest != i) {
HeapNode temp = {arr[largest], largest};
arr[node.index] = arr[temp.index];
arr[temp.index] = node.data;
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--) {
// 将堆顶元素与最后一个元素交换
HeapNode temp = {arr[0], 0};
arr[0] = arr[i];
arr[i] = temp.data;
// 调整剩余堆
heapify(arr, i, 0);
}
}
// 测试函数
int main() {
int arr[] = {9, 4, 7, 1, 6, 3, 5, 8, 2, 0}; // 10个不重复正整数
int n = sizeof(arr) / sizeof(arr[0]);
printf("Before sorting: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
heapSort(arr, n);
printf("After sorting: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
运行这个程序,你会得到一个从小到大排序后的结果。注意,这里假设输入的10个数都是非负整数并且互不相同。
阅读全文