程序员必备十大算法2-堆排序(堆是一种树的数据结构,学习前请先了解堆的定义和构建)(qq:3100310659)

堆排序
话不多说,先上代码

#include<bits/stdc++.h>
using namespace std;
//堆排序
int a[101];
void sift(int a[],int i,int n)
{
    //父子关系为二倍
	int father=i;
	int child=i*2;
	while(child<=n)
	{
		if(child<n&&a[child]<a[child+1])child++;
		if(a[father]>a[child])break;
		else
		{
			int t=a[father];
			a[father]=a[child];
			a[child]=t;
			father=child;
			child=father*2;
		}
	}
}
void heapsort(int *a,int n)//int *a和int a[]的作用一样,可以互换,
                          //就是引入宿主第一个数的地址,可以按照自己的喜好
                           //使用其中一个
{
	//初始化一个堆,一定要从下到上
	for(int i=n/2;i>0;i--)
		sift(a,i,n);
	//堆顶和最后互换
     for(int i=1;i<n;i++)
	 {
	 	int t=a[1];
	 	a[1]=a[n+1-i];
	 	a[n+1-i]=t;
	 	//重新刷新堆
	 	sift(a,1,n-i);//递归再来一遍
	  } 
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	    cin>>a[i];
	heapsort(a,n);
	for(int i=1;i<=n;i++)
	    cout<<a[i]<<" ";
	return 0;
 } 

我们这里就使用(二叉树)大顶堆,升序为例子
依旧是互换,不过是根节点和最后的一个一子节点互换,并且去掉叶子(说的好高大上,其实专业名词就是吓人的,代码却简单的不要不要的)
根就是顶上的那个最大的那个数字嘛,那个叶子就是最小的那个嘛(出现了一个最重要的部分了,如何保证最小的位置呢?让他的孩子中最小的在最右边嘛if(child<n&&a[child]<a[child+1])child++;(换位置不一定要用三角形转换,换换脚标也可以));
看的懂吗?啥?没看懂?快开打博主(qq:3100310659(备注c++学习,否则))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值