题目描述
实现堆排序。
示例
- 输入
- 第一行输入数组元素个数
- 第二行输入数组各个元素
- 输出
- 输出排序好的数组元素
示例 1
输入:
5
9 7 5 3 1
输出:
1 3 5 7 9
示例 2
输入:
6
5 15 8 12 20 2
输出:
2 5 8 12 15 20
题解
堆排序是指利用堆这种数据结构所设计的一种排序算法,是基于完全二叉树的排序方法。
堆排序的时间复杂度是 O(nlogn) 。
堆排序是不稳定的算法。
最大堆进行升序排序的算法:
- 初始化堆:将数组 (a[1 : n]) 构造成最大堆。
- 交换数据:将 (a[1]) 和 (a[n]) 交换,使 (a[n]) 是 (a[1 : n]) 中的最大值;然后将 (a[1 : n - 1]) 重新调整为最大堆。 接着,将 (a[1] 和 a[n - 1]) 交换,使 (a[n - 1]) 是 (a[1 : n - 1]) 中的最大值,然后将 (a[1 : n - 2]) 重新调整为最大值。依次类推,直至整个数组都是有序的
若要进行降序排序,可以构建最小堆。
代码
#include <iostream>
#include <vector>
using namespace std;
vector<int> v(1);
// 构造最大堆
void max_heap(vector<int> &v, int i, int n)
{
int j = 2 * i;
int temp = v[i];
while(j < n)
{
if(j + 1 < n && v[j] < v[j+1])
{
j++;
}
if(temp > v[j])
{
break;
}
else
{
v[i] = v[j];
i = j;
j = 2 * i;
}
}
v[i] = temp;
}
void swap(int i, int j)
{
v[0] = v[i];
v[i] = v[j];
v[j] = v[0];
}
// 堆排序
void heap_sort(vector<int> &v, int n)
{
for (int i = n / 2; i >= 1; i--)
{
max_heap(v, i, n);
}
for (int i = n; i >= 1; i--)
{
swap(i, 1);
max_heap(v, 1, i);
}
}
int main()
{
int n = 0;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> v[i];
}
heap_sort(v, n);
for (int i = 1; i <= n; i++)
{
cout << v[i] << " ";
}
return 0;
}