归并排序(递归与迭代)

归并排序
采用分而治之的思想 采用递归 分成小部分 (对半分) 治:将正确答案对在一起
图片网上找的
在这里插入图片描述
在这里插入图片描述

void mergesort(int a[],int n)==递归分==
{
	if(n>1)
	{
	  int *list1=a;
	  int list1_size=n/2;
	  int *list2=a+n/2;
	  int list2_size=n-list1_size;
      mergesort(list1,list1_size);==左半部分==
      mergesort(list2,list2_size);==右半部分==
      merging(list1,list1_size,list2,list2_size);==左右两边正确部分合==**治之**
    }
}
void merging(int *list1,int list1_size,int *list2,int list2_size)
{
	int temp[5];
	int i=0;int j=0;int k=0;
	while( i<list1_size&&j<list2_size )
	{
		if( list1[i]<list2[j] )
		{
			temp[k++]=list1[i++];
		}
		else
		{
			temp[k++]=list2[j++];
		}
	}
	while( i<list1_size )
	{
		temp[k++]=list1[i++];
	 } 
		while( j<list2_size )
	{
		temp[k++]=list2[j++];
	 } 
	int m;
	for(m=0;m<(list1_size+list2_size);m++)
	{
		list1[m]=temp[m];
	}
}

迭代

void mergesort(int a[],int n)
{
	int i,left_min,left_max,right_min,right_max;
	int *temp=(int *)malloc(n*sizeof(int)) ;
	int next; 
	for(i=1;i<n;i=i*2)//步长 
	{
	    for(left_min=0;left_min<n-i;left_min=right_max)
	    {
	    	right_min = left_max=left_min+i;//每次选两组  
	    	right_max=left_max+i;
	    	if( right_max>n )
			{
				right_max = n;
			} 
			next=0;
			while( left_min<left_max && right_min < right_max)//和归并相同 
			{
				if( a[left_min]<a[right_min])
				{
					temp[next++]=a[left_min++];
				}
				else
				{
					temp[next++]=a[right_min++];
				}
			}
			while(left_min<left_max)
			{
			    a[--right_min]=a[--left_max];//处理的非常巧妙 
			 }
			while( next > 0 )
			{
				a[--right_min]=temp[--next];//right_min的处理 
				
			 } 
		}
	
	}	
}

巧妙之处在于此
如果左半部分剩余 则将剩余的插入右半部分的最右边 因为(这是在原数组上操作,右边的已经进入工作数组)
将工作数组插入进原数组。这里必须关注right_min的值
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值