分治法之归并排序(优化版)

#include <stdio.h>

#define	THRESHOLD	28

void ModMerge(int Array[],int TempArray[],int left,int right,int middle);
void InsertSort(int Array[],int length);
void ModMergeSort(int Array[], int TempArray[],int left,int right)
{
	int middle;

	if(right-left+1 > THRESHOLD) //如果序列长度大于阀值(28),递归进行归并
	
	//if(left<right)
	{
		middle=(left+right)/2;
		ModMergeSort(Array,TempArray,left,middle);	//对左边一半进行递归
		ModMergeSort(Array,TempArray,middle+1,right);	//对右边一半进行递归
		ModMerge(Array,TempArray,left,right,middle);	//进行归并
	}
	else InsertSort(&Array[left],right-left+1); //小长度子序列列进行插入排序
												//“&”传Array[left]的地址
}

//优化的归并排序两个有序子序列归并,右子序逆置了,都从两端向中间扫描,归并到新数组
void ModMerge(int Array[],int TempArray[],int left,int right,int middle)
{
	int index1,index2;
	int i,j,k;
	for(i=left;i<=middle;i++)
	{
		TempArray[i]=Array[i];		//复制左边的子序列
	}
	for(j=1;j<=right-middle;j++)
	{
		TempArray[right-j+1]=Array[j+middle];	//复制右边的子序列,但顺序颠倒过来
	
	}
	//开始归并,取较小者插入合并数组中
	for(index1=left,index2=right,k=left;k<=right;k++)
		if(TempArray[index1] <= TempArray[index2])
			Array[k]=TempArray[index1++];
		else 
			Array[k]=TempArray[index2--];
}

void InsertSort(int Array[],int length)		//直接插入排序
{
	int Temp;
	int i,j;
	for(i=1;i<length;i++)
	{
		Temp=Array[i];
		j=i-1;
		//往前寻找记录i的正确位置
		while(j>=0 && Temp< Array[j])
		{
			Array[j+1]=Array[j];
			j=j-1;
		}
		Array[j+1]=Temp;
	}
}

int main()
{
	int Array[30]={8,2,4,7,6,1,9,3,5,0,23,10,25,11,18,12,17,24,13,15,22,16,14,19,21,20,29,28,26,27};
	int TempArray[30];
	int i,left,right,middle;
	left=0,right=29;
	
	ModMergeSort(Array,TempArray,left,right,middle);

	for(i=left;i<=right;i++)
		printf("%d ",Array[i]);
	printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值