#include <stdio.h>

// 堆排序函数声明 void heapSort(int arr[], int len);

// 建立大根堆函数声明 void buildMaxHeap(int arr[], int len);

// 维护大根堆函数声明 void heapAdjust(int arr[], int i, int len);

// 打印数组函数声明 void printArray(int arr[], int len);

int main() { int arr[20]; int len = 20;

printf('Enter 20 numbers: ');
for (int i = 0; i < len; i++) {
    scanf('%d', &arr[i]);
}

printf('Original array: \n');
printArray(arr, len);

heapSort(arr, len);

printf('Sorted array: \n');
printArray(arr, len);

return 0;

}

// 堆排序函数实现 void heapSort(int arr[], int len) { buildMaxHeap(arr, len); // 建立大根堆 printf('Heap after initialization: \n'); printArray(arr, len);

for (int i = len - 1; i >= 1; i--)
{
    int temp = arr[i];  // 交换堆顶元素和最后一个元素
    arr[i] = arr[0];
    arr[0] = temp;

    heapAdjust(arr, 0, i);  // 重新构建大根堆
    printf('Heap after iteration %d: \n', len - i);
    printArray(arr, len);
}

}

// 建立大根堆函数实现 void buildMaxHeap(int arr[], int len) { // 从最后一个非叶结点开始,向前依次调用HeapAdjust函数,构建大根堆。 for (int i = (len - 2) / 2; i >= 0; i--) { heapAdjust(arr, i, len); } }

// 维护大根堆函数实现 void heapAdjust(int arr[], int i, int len) { int temp = arr[i]; int child = 2 * i + 1;

while (child < len)
{
    if (child + 1 < len && arr[child] < arr[child + 1]) // 如果右子节点存在,且比左子节点大
    {
        child++;
    }

    if (arr[child] > temp)
    {
        arr[i] = arr[child];
        i = child;
        child = 2 * i + 1;
    }
    else
    {
        break;
    }
}

arr[i] = temp;

}

// 打印数组函数实现 void printArray(int arr[], int len) { for (int i = 0; i < len; i++) { printf('%d ', arr[i]); } printf('\n'); }

// 答辩内容:这是一个使用堆排序算法对输入的20个数进行排序的程序。程序首先通过输入函数将用户输入的20个数存储在数组中,然后调用heapSort函数对数组进行排序。在heapSort函数中,首先调用buildMaxHeap函数建立大根堆,然后通过循环将堆顶元素与最后一个元素交换,并调用heapAdjust函数重新构建大根堆。最后,程序调用printArray函数打印排序后的数组。

// 堆排序算法的核心思想是通过建立大根堆,将数组中的最大元素放在堆顶,然后将堆顶元素与最后一个元素交换位置,再重新构建大根堆。重复这个过程,直到整个数组有序。

// 在程序输出中,每次迭代后都会打印当前的堆,可以观察到堆在迭代过程中的变化。


原文地址: https://www.cveoy.top/t/topic/pOhr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录