算法与数据结构(三)--归并排序(2路归并排序)

本文详细介绍了2路归并排序的基本原理及实现步骤。首先将数组分成两部分,递归地对每部分进行排序,最后将两部分有序数组合并为一个整体。文章通过具体的代码示例展示了这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归并排序,就是将前后相邻的多个有序序列归并成一个新的有序序列的过程。

这里,我们讲的是2路归并,也就是怎么将两个相邻序列归并成一个序列。

下面讲一下算法的思路:

1.如果当前序列多于一个元素,将其均分为两个序列

2.对每个序列递归地调用归并排序,就是为了实现每个序列都有序,所以需要进行排序

3.将已经排序好的两个序列归并成一个序列。

第3步的归并过程其实就是一个采用分治法进行排序的过程,我们通过新建一个数组,然后,不断地在原来两个序列的首端取出元素,进行对比,将较小的元素依次放入一个新建的数组中,当有一个数组取值取到了尽头的时候,将另一个数组的剩下部分直接放入新的数组,这样就完成了归并。


下面是代码实现:

#include "stdafx.h"
#include "malloc.h"
#include <iostream>
using namespace std;
//二路归并,将s中的片段i到m,和m+1到n归并起来
void Merge(int s[],int r[],int i,int m,int n)
{	
	int j=0,k=0;
	for(j=m+1,k=i;i<=m&&j<=n;k++){
		if (s[i]<s[j]){
			r[k] = s[i++];
		}else{
			r[k] = s[j++];
		}
	}
	//i,j记录的是下一个要排序的位置
	//有一边先插值排序结束,将剩下的部分依次放入数组中
	if (i<=m){
		for (int t= 0;t<=m-i;t++){
			r[k+t] = s[i+t];
		}
	}
	if (j<=n){
		for (int t= 0;t<=n-j;t++){
			r[k+t] = s[j+t];
		}
	}
}

void MSort(int s[],int r[],int i,int j)
{
	if (i==j)
	{ r[j] = s[i];
	}else{
		
		int *tmp = (int *)malloc((j-i+1)*sizeof(int));
		//int tmp[] = {0,0,0,0,0,0};
		int m = (i+j)/2;//拆分
		MSort(s,tmp,i,m);
		MSort(s,tmp,m+1,j);
		Merge(tmp,r,i,m,j);//归并
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	int a[]={5,2,6,3,9,4};
	int *b = (int *)malloc(sizeof(a));
	//int c[] = {0,0,0,0,0,0};
	MSort(a,b,0,5);
	for (int i=0;i<=5;i++)
	{
		cout<<b[i]<<endl;
	}
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值