软件设计师算法之分治法--归并排序

    最近准备要考中级软件设计师。该门考试涉及到算法相关的,刚好也顺带着整理下之前自己学习过的知识。

    算法的学习没有什么捷径,就是理解算法思想和逻辑。最重要的一点,一定要自己编写代码,调试通过,这样才算是完成了算法的学习。

     2路归并排序就是每次都划分数组为前后2半,对这2半再次划分为2半,如此递归划分之后只剩下1个元素。1个元素当然是有序的,这时候递归也是到了最底层,接着就是开始向上归并了。归并的时候就是把前一半元素(有序的)和后一半元素(有序的)进行插入排序。一直归并到数组全部有序,如此就完成了整个排序过程。

     编写的代码如下:

     

static void Merge(int dataSrc[],int start,int mid,int end)
{
	int frontIndex = 0;
	int rearIndex = 0;
	int dstIndex = start;

	/* 如果不申请临时空间,那么每次归并插入数据的时候可能会移动大量数据*/
	int* pTempFront = (int*)new int[mid-start+1];
	int* pTemRear = (int*)new int[end-mid];

	memcpy(pTempFront,&dataSrc[start],sizeof(int)*(mid-start+1));
	memcpy(pTemRear,&dataSrc[mid+1],sizeof(int)*(end-mid));

	for(frontIndex=0,rearIndex=0;(frontIndex<(mid-start+1))&&(rearIndex<(end-mid));)
	{
		if(pTempFront[frontIndex] > pTemRear[rearIndex])
		{
			dataSrc[dstIndex++] = pTemRear[rearIndex++];
		}
		else
		{
			dataSrc[dstIndex++] = pTempFront[frontIndex++];
		}
	}
	for(;frontIndex<(mid-start+1);frontIndex++)
	{
		dataSrc[dstIndex++] = pTempFront[frontIndex];
	}

	for(;rearIndex<(end-mid);rearIndex++)
	{
		dataSrc[dstIndex++] = pTemRear[rearIndex];
	}

	delete []pTempFront;
	delete []pTemRear;
}

void static MergeSortHelp(int dataSrc[],int start,int end)
{
	if(start < end)
	{
		int mid = (start+end)/2;
		MergeSortHelp(dataSrc,start,mid);
		MergeSortHelp(dataSrc,mid+1,end);
		Merge(dataSrc,start,mid,end);
	}
}

void MergeSort(int data[],int dataLen)
{
	MergeSortHelp(data,0,dataLen-1);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值