堆排序是一种利用堆数据结构的排序算法,主要的步骤包括:
- 将待排序数组构建成一个大顶堆(或小顶堆),使得每个父节点的值都大于(或小于)其左右子节点的值。
- 交换堆顶元素(即数组的第一个元素)和堆末尾元素,然后缩小堆的范围,再次调整堆,使其满足堆的性质。
- 重复步骤2,直到堆的范围缩小到1,排序完成。
以下是C语言实现堆排序的代码:
// 交换两个元素 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 调整堆 void heapify(int arr[], int n, int i) { 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) { swap(&arr[i], &arr[largest]); // 继续调整堆 heapify(arr, n, largest); } } // 堆排序 void heapSort(int arr[], int n) { // 构建堆 for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } // 逐个从堆顶取出元素 for (int i = n - 1; i > 0; i--) { // 将堆顶元素(最大值)与当前堆范围的末尾元素交换 swap(&arr[0], &arr[i]); // 缩小堆的范围,重新调整堆 heapify(arr, i, 0); } }
使用示例:
#includeint main() { int arr[] = { 12, 11, 13, 5, 6, 7 }; int n = sizeof(arr) / sizeof(arr[0]); heapSort(arr, n); printf("排序结果:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; }
输出结果:
排序结果:5 6 7 11 12 13