求助
  • 板块学术版
  • 楼主Vizzi_02
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/9/20 19:04
  • 上次更新2023/11/4 06:02:39
查看原帖
求助
341396
Vizzi_02楼主2021/9/20 19:04

堆排哪里写错了,建堆写得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;
}
2021/9/20 19:04
加载中...