二路归并排序

本文深入探讨了归并排序算法的两种实现方式:递归与非递归。详细讲解了如何通过递归调用将数组分割并合并成有序状态,以及如何使用非递归方式通过逐步增加合并步长来排序数组。提供了具体的代码示例,帮助读者理解归并排序的运作机制。

1、递归实现

(1)、将数组a的[l1,r1]与[l2,r2]区间合并为有序区间:

const int maxn=100;

//将数组a的[l1,r1]与[l2,r2]区间合并为有序区间 
void merge(int a[],int l1,int r1,int l2,int r2)
{
	int temp[maxn];  //先开个大的!  
	int index=0;
	
	int i=l1;	
	int j=l2;
	while(i<=r1&&j<=r2)
	{
		if(a[i]<a[j])
		{
			temp[index++]=a[i++];
		}
		else
		{
			temp[index++]=a[j++];
		}
	}
	while(i<=r1)
	{
		temp[index++]=a[i++];
	}
	while(j<=r2)
	{
		temp[index++]=a[j++];
	}
	/*
	for(int k=l1,m=0;k<index;k++,m++)
	{
		a[k]=temp[m];
	}
	*/
	for(i=0;i<index;i++)
	{
		a[l1+i]=a[i];
	} 
}

(2)、将数组的区间[left,right]进行归并排序:

//将数组的区间[left,right]进行归并排序
void mergeSort(int a[],int left,int right)
{
	if(left<right)
	{
		int mid=(left+right)/2;
		mergeSort(a,left,mid);
		mergeSort(a,mid+1,right);
		merge(a,left,mid,mid+1,right);  //有点类似二叉树的后序遍历 
	}
}

2、非递归实现

【方式一】merge:

void mergeSort(int a[])
{
	for(int step=2;step/2<=n;step*=2)
	{
		for(int i=1;i<=n;i+=step)
		{
			int mid=i+step/2-1;
			if(mid+1<=n)  //右子区间还有元素 
			{
				merge(a,i,mid,mid+1,min(i+step-1,n)); 
			}
			//if(mid+step-1<=n)  //写的什么!! 
		} 		
		/*
		for(int i=1;i<=n;i+=step)
		{
			merge(a,i,step/2,step/2+1,i+step-1);
		}*/
		//WA!!!		
	}	
} 

【方式二】sort:

void mergeSort(int a[])
{
	for(int step=2;step/2<=n;step*=2)
	{
		for(int i=1;i<=n;i+=step)
		{
			sort(a+i,a+min(n+1,i+step))  //尤需记得取二者之小值! 
			//sort(a+i,a+step-1); 
		}		
	}	
}

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值