利用stl算法和迭代器编程实现堆排序
时间: 2023-12-22 17:46:01 浏览: 85
堆排序是一种基于堆数据结构的排序算法,它在最坏情况下的时间复杂度为O(nlogn)。下面是使用STL算法和迭代器实现堆排序的示例代码:
```c++
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
// 堆排序
void heap_sort(vector<int>& nums) {
// 建立最大堆
make_heap(nums.begin(), nums.end());
// 从堆顶开始,依次将最大元素放到数组末尾
for (int i = nums.size() - 1; i >= 0; --i) {
// 将堆顶元素(即最大元素)与数组末尾元素交换
swap(nums[0], nums[i]);
// 对剩余未排序部分重建最大堆
int parent = 0, child = 1;
while (child < i) {
// 找到左右孩子中较大的一个
if (child + 1 < i && nums[child] < nums[child + 1])
++child;
// 如果父节点比孩子节点小,则交换两者
if (nums[parent] < nums[child]) {
swap(nums[parent], nums[child]);
parent = child;
child = parent * 2 + 1;
}
else
break;
}
}
}
int main() {
vector<int> nums{ 3, 5, 2, 8, 6, 4, 1, 9, 7 };
heap_sort(nums);
for (int num : nums)
cout << num << " ";
return 0;
}
```
在上面的代码中,我们首先使用`make_heap()`函数将输入数组`nums`转换成最大堆。然后从堆顶开始,依次将最大元素放到数组末尾,并对剩余未排序的部分重建最大堆。这里的重建最大堆使用了类似于堆调整的算法。最终,输出的数组就是有序的了。
阅读全文