用stl算法和迭代器编程实现堆排序。
时间: 2023-12-25 08:51:03 浏览: 81
堆排序算法实现
堆排序是一种基于堆的排序算法,它的时间复杂度为O(nlogn)。下面是使用STL算法和迭代器实现堆排序的示例代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 堆排序
template<typename T>
void heapSort(vector<T>& array) {
// 将数组转换为堆
make_heap(array.begin(), array.end());
// 依次取出堆顶元素并重新调整堆
for (int i = array.size() - 1; i > 0; i--) {
// 取出堆顶元素
pop_heap(array.begin(), array.begin() + i + 1);
// 将堆顶元素放到数组末尾
swap(array[0], array[i]);
// 重新调整堆
adjust_heap(array.begin(), i);
}
}
// 调整堆
template<typename T>
void adjust_heap(T begin, int size) {
int i = 0;
int j = 2 * i + 1;
T end = begin + size;
while (j < size) {
// 找出左右子节点中较大的一个
if (j + 1 < size && *(begin + j) < *(begin + j + 1)) {
j++;
}
// 如果父节点比子节点小,则交换父子节点的值
if (*(begin + i) < *(begin + j)) {
swap(*(begin + i), *(begin + j));
i = j;
j = 2 * i + 1;
} else {
break;
}
}
}
int main() {
vector<int> array = {3, 6, 1, 8, 2, 4, 9, 5, 7};
heapSort(array);
for (auto it = array.begin(); it != array.end(); it++) {
cout << *it << " ";
}
return 0;
}
```
在上面的代码中,我们首先使用make_heap函数将数组转换为堆,然后依次取出堆顶元素并重新调整堆,直到所有元素都被取出为止。在调整堆的过程中,我们使用了自定义的adjust_heap函数,它用于将一个不符合堆定义的子树调整为堆。
运行结果为:1 2 3 4 5 6 7 8 9
阅读全文