归并排序

归并排序思想:

  • 划分为两个子序列
  • 分别对每个子序列归并排序
  • 有序子序列合并

/*两路归并排序算法框架*/
template <class Record>
void MergeSort(Record Array[], Record TempArray[], int left, int right){
	//Array为待排序数组,left,right两端
	int middle;
	if (left < right){   //序列中只有0或1个记录,不用排序
		middle = (left + right) / 2;   //平分为两个子序列
		//对左边一半进行递归
		MergeSort(Array, TempArray, left, middle);
		//对右边一半进行递归
		MergeSort(Array, TempArray, middle + 1, right);
		Merge(Array, TempArray, left, right, middle);  //归并
	}
}

//两个有序子序列都从左向右扫描,归并到新数组
template <class Record>
void Merge(Record Array[], Record TempArray[], int left, int right, int middle){
	int i, j, index1, index2;
	//将数组暂存入临时数组
	for (j = left; j <= right; j++)
		TempArray[j] = Array[j];
	index1 = left;          //左边子序列的起始位置
	index2 = middle + 1;    //右边子序列的起始位置
	i = left;                //从左开始归并
	while (index1 <= middle&&index2 <= right){
		//取较小者合并数组中
		if (TempArray[index1] <= TempArray[index2])
			Array[i++] = TempArray[index1++];
		else
			Array[i++] = TempArray[index2++];
	}
	while (index1 <= middle)    //只剩下左序列,可以直接复制
		Array[i++] = TempArray[index1++];
	while (index2 <= right)       //与上个循环互斥,复制有序列
		Array[i++] = TempArray[index2++];
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值