C/C++归并排序

归并排序

视频资料王道考研,链接如下:
【王道计算机考研 数据结构】 https://www.bilibili.com/video/BV1b7411N798/?p=94&share_source=copy_web&vd_source=734d9fe130776e8ae82b2b5371a5f5b8

主要是学习数据结构,真的干什么请直接使用STL库中的排序算法

我后面的序列都是数组

归并:把两个或多个已经有序的序列合并成一个

二路归并

二路归并示意图

二路归并代码

注意一下:
我这里和它的不太一样,我这里归并函数只管归并,别的不管;
最后把归并的结果保存到theSave里;

/*功能:二路归并
* 输入:
* theFirst:第一个数组头指针
* n1:第一个数组元素个数
* theSecond:第二个数组头指针
* n2:第二个数组元素个数
* theSave:保存归并结果的开头位置指针
* 返回:
* 其它:
* 请保证两个数组都有序,顺序由小到大
*/
void myMerge(int* theFirst, int n1, int* theSecond, int n2, int* theSave)
{
	int* pA = theFirst;//遍历第一个数组所用指针
	int* pB = theSecond;//遍历第二个数组所用指针
	int* pS = theSave;//遍历存储位置的指针

	while (pA < theFirst + n1 && pB < theSecond + n2)
	{
		if (*pA <= *pB)
		{
			*pS = *pA;
			pA++;
		}
		else
		{
			*pS = *pB;
			pB++;
		}
		pS++;
	}
	while (pA < theFirst + n1)//如果第一个数组中有剩余的,复制到存储位置
	{
		*pS = *pA;
		pA++;
		pS++;
	}
	while (pB < theSecond + n2)//如果第二个数组中有剩余的,复制到存储位置
	{
		*pS = *pB;
		pB++;
		pS++;
	}	
}

二路归并排序实现代码

代码

/*功能:二路归并排序
* 输入:
* A:要排序的数组指针
* n:要排序的数组元素个数
* 返回:
* 其它:
* 顺序由小到大
*/
void mergeSort(int* A, int n);

注意:
我和它的有点不一样
其一,我又封装了一层,不使用全局变量
其二,我用的我的归并函数,归并辅助数组中的内容然后保存在原数组中,所以在调用归并函数之前,先将原数组中的内容复制到辅助数组 中。
顺便说一下
在这里插入图片描述
它归并的时候,把原数组的元素保存到了辅助数组的“对应”位置,好像并不一定要“对应”,按我的归并代码随便哪里都行,就开头就好。
可能是后面的外部排序涉及操作系统的问题吧……
如果需要对应,在递归函数的代码中加入参数原数组指针,简单修改就好。

/*功能:二路归并排序的递归函数
* 输入:
* low:正在处理的“开头”位置
* high:正在处理的“结尾”位置
* assist:辅助数组
* 返回:
* 其它:
* 请保证两个部分都有序,顺序由小到大
*/
void mergeSortRecursion(int* low, int* high, int* const assist)
{
	if (low < high)
	{
		int* middle = low + (high - low) / 2;//从中间划分
		if(low<middle)
			mergeSortRecursion(low, middle, assist);//递归,对左半部分归并排序
		if(middle+1<high)
			mergeSortRecursion(middle + 1, high, assist);//递归,对右半部分归并排序

		//将本次要处理的元素复制到辅助数组,注意并不用放到辅助数组的对应位置,从头放就行
		int* p = low;
		int* q = assist;
		for (; p <= high; p++, q++)
		{
			*q = *p;
		}
		//对辅助数组中的对应元素进行归并,并保存到原本数组的相应位置
		myMerge(assist, middle - low + 1, assist + (middle - low + 1), high - middle, low);
	}
}


void mergeSort(int* A, int n)
{//这里再封装一下,以不使用全局变量
	int* theAssist = new int[n];//辅助数组
	mergeSortRecursion(A,A+n-1, theAssist);
}

测试

//归并排序测试
void test5(void)
{
	int testArray1[8] = { 49,38,65,97,76,13,27,49 };
	cout << "原本" << endl;
	myArrayPrint(testArray1, 8);
	cout << "归并排序" << endl;
	mergeSort(testArray1, 8);
	myArrayPrint(testArray1, 8);

	cout << endl;

	int testArray2[20] = { 78,84,77,10,48,11,13,85,65,21,15,30,56,12,14,34,55,34,98,43 };
	cout << "原本" << endl;
	myArrayPrint(testArray2, 20);
	cout << "归并排序" << endl;
	mergeSort(testArray2, 20);
	myArrayPrint(testArray2, 20);
	
	cout << endl;

	//10-24
	int testArray3[15] = { 23,17,10,21,14,22,11,24,18,12,15,13,19,20,16 };
	cout << "原本" << endl;
	myArrayPrint(testArray3, 15);
	cout << "归并排序" << endl;
	mergeSort(testArray3, 15);
	myArrayPrint(testArray3, 15);
}

结果
在这里插入图片描述

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cctv1324

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值