归并排序的递归算法

      递归算法有个关键就是递归结束的条件。代码如下:

      //bugs:算法中有个小bug,就是我没有考虑到(n+1)/2时,n+1为奇数的情况。      

#include <stdio.h>
#include <conio.h>
#define MAX 1000

//函数原型
void swap(int *a,int *b);
void sort_parallel(int target[],int start1,int start2,int num,int n);
void merge_sort_recurrence(int target_array[],int n);
int main()
{
	int test[]={3,1,2,6,4,11,5,8,7,10};
	merge_sort_recurrence(test,10);
	for(int i=0;i<10;i++)
		printf("%d ",test[i]);
	getch();
}

//归并排序(递归法)
void merge_sort_recurrence(int target_array[],int n)
{
	
	if(n==1)
		return ;
	if(n==2)
	{
		if(target_array[0]>target_array[1])
			swap(&target_array[0],&target_array[1]);
	}
	merge_sort_recurrence(target_array,(n+1)/2);	
	merge_sort_recurrence(target_array+(n+1)/2,n/2);
	sort_parallel(target_array,0,(n+1)/2,(n+1)/2,n);
}

//为两个有序序列进行排序  
void sort_parallel(int target[],int start1,int start2,int num,int n)
{
	int flag=0;
	int temp_array[MAX]={0};
	int i=0,j=0;
	while(i<num && j<num && start1+i<n && start2+j<n )
	{
		if(target[start1+i]<target[start2+j])
		{
			temp_array[flag++]=target[start1+i];
			i++;			
		}
		else if(target[start1+i]==target[start2+j])
		{
			temp_array[flag++]=target[start1+i];
			i++; j++;
		}
		else
		{
			temp_array[flag++]=target[start2+j];
			j++;
		}
	}
	
	while(i<num && start1+i<n)
		temp_array[flag++]=target[start1+i++];  
	while(j<num && start2+j<n)
		temp_array[flag++]=target[start2+j++];
	
	//把有序序列覆盖到原数组
	for(i=start1,j=0;i<n && i<start1+2*num;i++,j++)
		target[i]=temp_array[j];
}
//交换
void swap(int *a,int *b)
{
	int temp=*a;
	*a=*b;
	*b=temp;
}
        总结:递归的写法比非递归简单,但是开销更大。


相关文章:归并排序的非递归算法     堆排序

      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值