堆排序的递归和非递归实现

非递归:

#include<iostream>
using namespace std;

void heapAdjust(int *a,int s,int len)
{
	int temp=a[s];
	for(int j=2*s;j<=len;j*=2)
	{
		if(j<len && a[j]<a[j+1])
			j++;
		if(a[j]>temp)
		{
			a[s]=a[j];
			s=j;
		}
		else
			break;
	}
	a[s]=temp;
}
void heapSort(int *a,int len)
{
	for(int i=len/2;i>=1;i--)
	{
		heapAdjust(a,i,len);
	}
	for(int i=len;i>1;i--)
	{
		swap(a[1],a[i]);
		heapAdjust(a,1,i-1);
	}
}


int main()
{
	int a[10]={0,10,25,8,18,22,4,12};
	heapSort(a,7);

	return 0;
}

递归:

方式1:

#include<iostream>
using namespace std;
//flag为false说明第一次的大顶堆还未建立成功
void heapAdjust(int *a,int s,int end,bool flag)
{
	int tmp=a[s];int n=s;
	for(int j=2*s;j<=end;j*=2)
	{
		if(j<end && a[j]<a[j+1])
			j++;
		if(a[j]<tmp)
			break;
		a[s]=a[j];s=j;
	}
	a[s]=tmp;s=n;
	if(flag==false && s>1)
		heapAdjust(a,s-1,end,flag);
	if(s==1)
	{flag=true;s=end;}
	if(flag && s>1)
	{
		swap(a[1],a[s]);
		heapAdjust(a,1,s-1,flag);
	}
}
int main()
{
	int a[10]={0,10,25,8,18,22,4,12,1};
	int len=8;  //最后一个元素的下标
	bool flag=false;
	heapAdjust(a,len/2,len,flag);
	return 0;
}

方式2:

#include<iostream>
using namespace std;

void heapAdjust(int *a,int s,int j,int temp,int end)
{
	if(j<=end)
	{
		if(j<end && a[j]<a[j+1])
			j++;
		if(a[j]<=temp)
		{
			a[s]=temp; return;
		}
		else
		{
			a[s]=a[j];
			heapAdjust(a,j,2*j,temp,end);
		}
	}
	else
	{
		a[s]=temp;return;
	}
}
void heapSort(int *a,int len)  //len 为最后一个元素的下标
{
	for(int i=len/2;i>=1;i--)
		heapAdjust(a,i,2*i,a[i],len);
	for(int i=len;i>1;i--)
	{
		swap(a[1],a[i]);
		heapAdjust(a,1,2,a[1],i-1);
	}
}
int main()
{
	int a[10]={0,10,25,8,18,22,4,12,1};
	heapSort(a,8);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值