堆排序

版权声明:学习是提高自身价值的一张很好且很有用的方式 https://blog.csdn.net/xiaolonggezte/article/details/80349386
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 100 + 10;

int a[maxn];



int n,len;

void update1(int x)//建堆时比较孩子节点
{
	int l = x * 2,r = l + 1;
	if(l <= n && a[l] > a[x])swap(a[x],a[l]);
	if(r <= n && a[r] > a[x])swap(a[x],a[r]);
}
void build()//建堆
{
	for(int i = n/ 2;i >= 1;i --)//从孩子节点开始更新
	{
		update1(i);
	}
}

void update2(int x)//比较根节点到叶子节点那条路
{
	int l = x * 2 ,r = l + 1;
	if(l > len && r > len)return ;
	if(l <= len && r > len)
	{
		swap(a[x],a[l]);
		update2(l);
		return;
	}

	if(l > len && r <= len)
	{
		swap(a[x],a[r]);
		update2(r);
		return;
	}

	if(a[l] > a[r])
	{
		swap(a[l],a[x]);
		update2(l);
	}
	else 
	{
		swap(a[r],a[x]);
		update2(r);
	}
}
void heap_sort()//堆排序
{
	build();
	len = n;
	for(int i = n;i > 1;i --)//
	{
		swap(a[1],a[i]);
		len --;
		update2(1);
	}
}
int main()
{
	n = 100;
	for(int i = 1;i <= n;i ++)
		a[i] = n - i + 1;
	heap_sort();
	for(int i = 1;i <= n;i ++)
		printf("%d%c",a[i],i < n ? ' ' : '\n');
	system("pause");
	return 0;
}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页