归并排序

归并排序,通过一一排序使得两个相邻的数字有序,二二排序使得四个相邻的数字有序,四四排序使得八个相邻的数字有序,通过一定的次数使得整个数组有序。

归并排序是稳定的。归并排序的空间复杂度位O(n),时间复杂度,不管初始数据有序还是乱序,都是要进行向下移动的。

bool mager_once(int *arr, int len, int gap)
{
	if (arr==NULL && len<1 && gap<=0)
	{
		return false;
	}
	int e1 = 0;
	int r1 = e1+gap-1;        
	int e2 = r1+1;
	int r2 = (e2+gap-1)<len ? (e2+gap-1):len-1;

	int *p = (int *)malloc(sizeof(int)*len);
	assert(p != NULL);
	int k = 0;

	while (e2 < len)
	{
		while(e1<=r1 && e2<=r2)    //用此条件会造成在最后一个值的时候,一个数会跳到下一组的比较中
		{
			if (arr[e1] <= arr[e2])
			{
				p[k] = arr[e1];
				e1++;
				k++;
			}
			if (arr[e1] > arr[e2])
			{
				p[k] = arr[e2];
				e2++;
				k++;
			}
		}

		while(e1<=r1)
		{
			p[k] = arr[e1];
			e1++;
			k++;
		}
		while(e2<=r2)
		{
			p[k] = arr[e2];
			e2++;
			k++;
		}

		e1 = r2+1;
	    r1 = e1+gap-1;
	    e2 = r1+1;
		r2 = (e2+gap-1)<len ? (e2+gap-1):len-1;
	}


	while (e1<len)//将e1中没有复制过去的数据进行复制
	{
		p[k] = arr[e1];
		k++;
		e1++;
	}

	while (len--)
	{
		arr[len] = p[len];
	}
	free(p);
	return true;
}

bool mager_sort(int *arr, int len)
{
	if(arr == NULL || len<1)
	{
		return false;
	}

	for(int i=1; i<len; i=i*2)
	{
		mager_once(arr, len, i);
	}
	return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值