文章
225
粉丝
165
获赞
361
访问
107.3k
#include <stdio.h>
// 堆化函数:调整以i为根的子树为大顶堆,统计交换次数
void heapify(int arr[], int n, int i, int *swap_count) {
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) {
// 交换根节点和最大元素
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
(*swap_count)++; // 交换次数加1
// 递归堆化受影响的子树(交换后子树可能不满足堆性质)
heapify(arr, n, largest, swap_count);
}
}
int main() {
int n;
// 输入序列长度
scanf("%d", &n);
int arr[n];
// 输入序列元素
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int swap_count = 0; /...
登录后发布评论
暂无评论,来抢沙发