文章

225

粉丝

165

获赞

361

访问

107.3k

头像
堆排序问题 题解:
P1941 南京理工大学2023年机试题
发布于2026年3月5日 16:18
阅读数 217

#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; /...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发