C语言实现堆排序算法 - 代码解析与优化
#include <stdio.h>\n\n// 堆排序函数声明\nvoid heapSort(int arr[], int len);\n\n// 建立大根堆函数声明\nvoid buildMaxHeap(int arr[], int len);\n\n// 维护大根堆函数声明\nvoid heapAdjust(int arr[], int i, int len);\n\n// 打印数组函数声明\nvoid printArray(int arr[], int len);\n\nint main()\n{\n\t\tint arr[20];\n\t\tint len = 20;\n\n\t\tprintf("Enter 20 numbers: ");\n\t\tfor (int i = 0; i < len; i++)\n\t\t{\n\t\t\tscanf("%d", &arr[i]);\n\t\t}\n\n\t\tprintf("Original array: \n");\n\t\tprintArray(arr, len);\n\n\t\theapSort(arr, len);\n\n\t\tprintf("Sorted array: \n");\n\t\tprintArray(arr, len);\n\n\t\treturn 0;\n}\n\n// 堆排序函数实现\nvoid heapSort(int arr[], int len)\n{\n\t\tbuildMaxHeap(arr, len); // 建立大根堆\n\t\tprintf("Heap after initialization: \n");\n\t\tprintArray(arr, len);\n\n\t\tfor (int i = len - 1; i >= 1; i--)\n\t\t{\n\t\t\t\tint temp = arr[i]; // 交换堆顶元素和最后一个元素\n\t\t\t\tarr[i] = arr[0];\n\t\t\t\tarr[0] = temp;\n\n\t\t\t\theapAdjust(arr, 0, i); // 重新构建大根堆\n\t\t\t\tprintf("Heap after iteration %d: \n", len - i);\n\t\t\t\tprintArray(arr, len);\n\t\t}\n}\n\n// 建立大根堆函数实现\nvoid buildMaxHeap(int arr[], int len)\n{\n\t\t// 从最后一个非叶结点开始,向前依次调用HeapAdjust函数,构建大根堆。\n\t\tfor (int i = (len - 2) / 2; i >= 0; i--)\n\t\t{\n\t\t\t\theapAdjust(arr, i, len);\n\t\t}\n}\n\n// 维护大根堆函数实现\nvoid heapAdjust(int arr[], int i, int len)\n{\n\t\tint temp = arr[i];\n\t\tint child = 2 * i + 1;\n\n\t\twhile (child < len)\n\t\t{\n\t\t\t\tif (child + 1 < len && arr[child] < arr[child + 1]) // 如果右子节点存在,且比左子节点大\n\t\t\t\t{\n\t\t\t\t\tchild++;\n\t\t\t\t}\n\n\t\t\t\tif (arr[child] > temp)\n\t\t\t\t{\n\t\t\t\t\tarr[i] = arr[child];\n\t\t\t\t\ti = child;\n\t\t\t\t\tchild = 2 * i + 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\tarr[i] = temp;\n}\n\n// 打印数组函数实现\nvoid printArray(int arr[], int len)\n{\n\t\tfor (int i = 0; i < len; i++)\n\t\t{\n\t\t\t\tprintf("%d ", arr[i]);\n\t\t\t}\n\t\tprintf("\n");\n\
原文地址: https://www.cveoy.top/t/topic/pOhD 著作权归作者所有。请勿转载和采集!