C 语言堆排序算法实现 - 代码详解及优化建议
{"title": "#include <stdio.h>\n\n// 堆排序函数声明 \n\n// 建立大根堆函数声明\nvoid heapSort(int arr[], int len);\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 int arr[21];\n int len = 21;\n\n printf("Enter 21 numbers: " );\n for (int i = 0; i < len; i++) {\n scanf("%d", &arr[i]);\n }\n\n printf("Original array: \n");\n printArray(arr, len);\n\n heapSort(arr, len);\n\n printf("Sorted array: \n");\n printArray(arr, len);\n\n return 0;\n}\n\n// 堆排序函数实现\nvoid heapSort(int arr[], int len)\n{\n buildMaxHeap(arr, len); // 建立大根堆\n printf("Heap after initialization: \n");\n printArray(arr, len);\n\n for (int i = len - 1; i >= 1; i--)\n {\n int temp = arr[i]; // 交换堆顶元素和最后一个元素\n arr[i] = arr[0];\n arr[0] = temp;\n\n heapAdjust(arr, 0, i); // 重新构建大根堆\n printf("Heap after iteration %d: \n", len - i);\n printArray(arr, len);\n }\n}\n\n// 建立大根堆函数实现\nvoid buildMaxHeap(int arr[], int len)\n{\n // 从最后一个非叶结点开始,向前依次调用HeapAdjust函数,构建大根堆。\n for (int i = (len - 2) / 2; i >= 0; i--)\n {\n heapAdjust(arr, i, len);\n }\n}\n\n// 维护大根堆函数实现\nvoid heapAdjust(int arr[], int i, int len)\n{\n int temp = arr[i];\n int child = 2 * i + 1;\n\n while (child < len)\n {\n if (child + 1 < len && arr[child] < arr[child + 1]) // 如果右子节点存在,且比左子节点大\n {\n child++;\n }\n\n if (arr[child] > temp)\n {\n arr[i] = arr[child];\n i = child;\n child = 2 * i + 1;\n }\n else\n {\n break;\n }\n }\n\n arr[i] = temp;\n}\n\n// 打印数组函数实现\nvoid printArray(int arr[], int len)\n{\n for (int i = 0; i < len; i++)\n {\n printf("%d ", arr[i]);\n }\n printf("\n");\n}\n
原文地址: https://www.cveoy.top/t/topic/pOgV 著作权归作者所有。请勿转载和采集!