c++算法实现堆排序,并简答减治法再堆排序中是如何应用的?
时间: 2023-06-21 07:06:36 浏览: 124
C++算法实现堆排序的步骤如下:
1. 将待排序数组构建成一个大根堆(或小根堆)。
2. 将堆顶元素与堆尾元素交换位置,此时堆尾元素为最大(或最小)值。
3. 排除堆尾元素,重新调整堆结构,使其满足堆的定义。
4. 重复步骤2和3,直到待排序数组长度为1。
减治法在堆排序中的应用主要体现在第3步中。在调整堆结构时,我们只需要对新加入堆中的元素进行调整,而不是对整个堆进行调整。这样可以减小时间复杂度,提高算法效率。
具体实现中,我们可以在向堆中加入新元素时,从该元素开始向上或向下调整堆结构,直到满足堆的定义。这样就只需要对新元素进行调整,而不是对整个堆进行调整,从而减小了时间复杂度。
以下是一个C++实现示例(以大根堆为例):
```c++
#include <iostream>
using namespace std;
void adjustHeap(int arr[], int i, int len)
{
int temp = arr[i]; // 待调整的元素
int k = 2 * i + 1; // 该元素的左子节点
while (k < len)
{
// 如果左子节点小于右子节点,则将k指向右子节点
if (k + 1 < len && arr[k] < arr[k + 1])
k++;
// 如果子节点大于待调整元素,则将子节点赋值给父节点
if (arr[k] > temp)
{
arr[i] = arr[k];
i = k;
k = 2 * i + 1;
}
else
break;
}
arr[i] = temp; // 将待调整元素放到最终位置
}
void heapSort(int arr[], int len)
{
// 构建大根堆
for (int i = len / 2 - 1; i >= 0; i--)
adjustHeap(arr, i, len);
// 交换堆顶元素和堆尾元素,并重新调整堆结构
for (int i = len - 1; i >= 1; i--)
{
swap(arr[0], arr[i]);
adjustHeap(arr, 0, i);
}
}
int main()
{
int arr[] = { 8, 5, 2, 6, 9, 3, 1, 4, 0, 7 };
int len = sizeof(arr) / sizeof(int);
heapSort(arr, len);
for (int i = 0; i < len; i++)
cout << arr[i] << " ";
return 0;
}
```
阅读全文