堆排序概述
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。
实例演示
1.第一步,升序建大堆
2.第二步,将根结点与最后的叶子结点交换,然后再次建大堆(每次最后确定的最大数不参与建大堆)
实现代码
1.升序-----建大堆
#include<iostream>
using namespace std;
#include<vector>
void AdjustDown(vector<int>& a,int n,int root)
{
int parent=root;
int child=parent*2+1;
while(child<n)
{
if(child+1<n&&a[child+1]>a[child])
{
++child;
}
if(a[child]>a[parent])
{
swap(a[child],a[parent]);
parent=child;
child=parent*2+1;
}
else
{
break;
}
}
}
void HeapSort(vector<int>& a,int n)
{
//排升序,建大堆
for(int i=(n-1-1)/2;i>=0;i--)
{
AdjustDown(a,n,i);
}
int end=n-1;
while(end>0)
{
swap(a[0],a[end]);
AdjustDown(a,end,0);
end--;
}
}
int main()
{
int n;
cin >> n;
vector<int> a;
while (n--)
{
int k;
cin >> k;
a.push_back(k);
}
HeapSort(a, a.size());
for (auto e : a)
{
cout << e << " ";
}
return 0;
}
结果:
2.降序-----建小堆
#include<iostream>
using namespace std;
#include<vector>
void AdjustDown(vector<int>& a,int n,int root)
{
int parent=root;
int child=parent*2+1;
while(child<n)
{
if(child+1<n&&a[child+1]<a[child])
{
++child;
}
if(a[child]<a[parent])
{
swap(a[child],a[parent]);
parent=child;
child=parent*2+1;
}
else
{
break;
}
}
}
void HeapSort(vector<int>& a,int n)
{
for(int i=(n-1-1)/2;i>=0;i--)
{
AdjustDown(a,n,i);
}
int end=n-1;
while(end>0)
{
swap(a[end],a[0]);
AdjustDown(a,end,0);
end--;
}
}
int main()
{
int n;
cin >> n;
vector<int> a;
while (n--)
{
int k;
cin >> k;
a.push_back(k);
}
HeapSort(a, a.size());
for (auto e : a)
{
cout << e << " ";
}
system("pause");
return 0;
}
结果:
堆排序的特性总结
- 堆排序使用堆来选数,效率就高了很多。
- 时间复杂度:O(N*logN)
- 空间复杂度:O(1)
- 稳定性:不稳定