归并排序

# include <stdio.h>
# include <stdlib.h>
/**
 * 时间:2016年6月6日 00:20:00
 * 内容:归并排序
 */
void Merge(int*,int *,int,int,int);
void MergePass(int*,int*,int,int);
void MergeSort(int*,int*,int);
void Info(int*,int);

int main(void)
{
	int a[10]={26,5,77,1,61,11,59,15,48,19};
	int b[10]={0};
 	Info(a,10);
 	MergeSort(a,b,10);
 	Info(b,10);

	return 0;
}
/**
 * 将两个有序的序列initlist[left,mid],
 * initList[mid+1,right]排序归并到mergeList中去
 * 		|--PS:这里指的是将initlist分为两段数组,进行归并排序.
 * @param initList  未排序的数组
 * @param mergeList 排序后的数组
 * @param left      最右边的元素角标
 * @param mid       中间+1个元素的角标
 * @param right     最右边元素的角标
 */
void Merge(int* initList,int* mergeList,int left,int mid,int right)
{
	int i=left;
	int j=mid+1;
	int k=left;
	while(i<=mid&&j<=right)
	{
		// 比较两端数组的元素的大小,进行排序
		if (initList[i]<initList[j])
			mergeList[k++]=initList[i++];	
		else 
			mergeList[k++]=initList[j++];	
		// 判断边界值,如果如果超过,就将这些元素直接复制到数组后面
		if(i>mid)
			while(j<=right) 
			    mergeList[k++]=initList[j++];
		else if (j>right)
			while(i<=mid)
			    mergeList[k++]=initList[i++];
	}
}
void Info(int*a,int n)
{
	for (int i=0;i<n;i++)
		printf("%d ",a[i]);
	printf("\n");
}
/**
 * 合并大小为s的相邻数组
 * @param initList  未排序的数组指针
 * @param mergeList 排序后的数组指针
 * @param n         数组的总长为n个
 * @param s         归并后的大小
 */
void MergePass(int* initList,int* mergeList,int n,int s)
{
	int i,j;
	for(i=0;i<=n-2*s+1;i+=2*s)
		Merge(initList,mergeList,i,i+s-1,i+2*s-1);	
	// 剩下的元素个数大于s小于2*s,对这一段用Merge函数
	if (i+s<n)
		Merge(initList,mergeList,i,i+s-1,n-1);
	// 剩下的元素个数小于s,直接从initList复制到mergeList里
	else
		for(j=i;j<=n-1;j++)
			mergeList[j]=initList[j];
}
void MergeSort(int* a,int* b,int n)
{
	int s=1;
	while(s<n) 
	{
	    MergePass(a,b,n,s);
	    s*=2;
	    MergePass(b,a,n,s);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值