堆排序:先将数据用PerDown函数调整为最大堆,然后每次取堆顶最大元素与堆最后一个位置交换,循环一次后将堆以堆顶为根节点继续调整为最大堆(排除最后已经归位的最大元素);
注意:堆排序数据从0开始存储;
时间复杂度:O(NlogN);
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAX 1010
using namespace std;
int S[MAX];
/*堆排序(S从0开始存储)*/
void PerDown(int p, int N)
{
int Parent, Child;
int X = S[p];
//左儿子小于N时执行,数组从0开始
for(Parent = p; Parent*2+1 < N; Parent = Child)
{
Child = Parent*2+1;
if(Child != N - 1 && S[Child] < S[Child + 1])
Child++;
if(X >= S[Child]) break;
else S[Parent] = S[Child];
}
S[Parent] = X;
}
void HeapSort(int N)
{
//将S调整为最大堆
for(int i = N/2 - 1; i >= 0; i--)
PerDown(i, N);
for(int i = N - 1; i >0; i--)
{
//将最大值换到最后
swap(S[0], S[i]);
//重新调整剩下的为最大堆,最后一个已排好忽略后面的
PerDown(0, i);
}
}
void Print(int N)
{
for(int i = 0; i < N; i++) cout<< S[i] <<" ";
}
int main()
{
int N = 10;
for(int i = 0; i < N; i++) cin >> S[i];
HeapSort(N);
Print(N);
return 0;
}