堆排哪里写错了,建堆写得O(n)的
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int heap[100000];
int a[100000];
int n;
inline int parent(int x)
{
return floor(x) / 2;
}
inline int lc(int x)
{
return x << 1;
}
inline int rc(int x)
{
return x << 1 | 1;
}
void push_down(int now,int mhp)
{
int i = now,j = lc(i),k = rc(i);
while(j <= mhp)
{
if(j + 1 <= mhp)
{
if(heap[k] > heap[j])
{
j = k;
}
}
if(heap[j] > heap[i])
{
swap(heap[j],heap[i]);
i = j;
j = lc(i);
}
else
{
break;
}
}
}
void flow_up(int now,int mhp)
{
int i = now,j = parent(now);
while(j >= mhp)
{
if(heap[j] < heap[i])
{
swap(heap[j],heap[i]);
i = j;
j = parent(i);
}
else
{
break;
}
}
}
void pop()
{
heap[1] = heap[n--];
push_down(1,n);
}
void build_heap()
{
for(int i = n >> 1;i >= 1;i--)
{
push_down(i,n);
}
}
void heap_sort()
{
for(int i = n;i >= 1;i--)
{
swap(heap[i],heap[1]);
push_down(1,i-1);
}
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i++)
{
cin >> heap[i];
}
build_heap();
// cout << "build before:" << endl;
// for(int i = 1;i <= n;i++)
// {
// cout << heap[i] << endl;
// }
heap_sort();
cout << endl;
for(int i = 1;i <= n;i++)
{
pop();
cout << heap[i] << endl;
}
return 0;
}