浅谈堆排序!!

堆排序本身可以视为完全二叉树,利用其一些性质来解决排序问题。
再谈堆排序之前当然要先了解堆和完全二叉树。
完全二叉树
通俗来讲完全二叉树是由于满二叉树引起的,准确来说就是满二叉树缺失一部分但也有一些规定
1.所有叶子节点都出现在 k 或者 k-1 层,而且从 1 到 k-1 层必须达到最大节点数;

2.第 k 层可以不是满的,但是第 k 层的所有节点必须集中在最左边。
需要注意的是不要把完全二叉树和“满二叉树”搞混了,完全二叉树不要求所有树都有左右子树,但它要求:

3.任何一个节点不能只有左子树没有右子树

4.叶子节点出现在最后一层或者倒数第二层,不能再往上
堆:
简单介绍下不深入来介绍,
它是利用完全二叉树的结构来维护一组数据,然后进行相关操作,一般的操作进行一次的时间复杂度在

O(1)~O(logn)之间。
堆还分为两种类型:大根堆、小根堆

顾名思义,就是保证根节点是所有数据中最大/小,并且尽力让小的节点在上方
假如有一无序数组s[7]={3,1,4,2,5,6},用堆排序顺序输出。
图解过程:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过图解大概了解到堆排序的求解过程。
下面进行代码解释:
|#include
#include
using namespace std;
void adjustheap(int s[],int i,int len)
{
int lchild=2i;
int rchild=2
i+1;
int max=i;

  	if(lchild<=len&&s[lchild]>s[max])   max=lchild;
  	if(rchild<=len&&s[rchild]>s[max])   max=rchild;
  	if(max!=i)
  	{
  		swap(s[i],s[max]);	
			 adjustheap(s,max,len);
	}
	
		return ; 
} 
void buildheap(int s[],int len)
{
	for(int i=len/2;i>0;i--)
	{
		adjustheap(s,i,len);
	 } 
}
void  heapsort(int s[],int len)
{
	buildheap(s,len);
	for(int i=len;i>0;i--)
	{
		swap(s[1],s[i]);
		adjustheap(s,1,i-1);
	}
}
int main()
{
	int s[100];
	int n;
	cout<<"请输入元素个数:";
	cin>>n;
	cout<<"请输入元素";
	for(int i=1;i<=n;i++)
	cin>>s[i];
	cout<<"排序前的序列:";
	 	for(int i=1;i<=n;i++)
	 	cout<<s[i]<<" "; 
	 	heapsort(s,n);
 cout<<"排序之后的序列:"; 
	for(int i=1;i<=n;i++)
	cout<<s[i]<<" ";
	return 0;
}|  |

|–|--|
| | |
在这里插入图片描述
谢谢大家支持!!第一次写又哪里不对请指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值