归并排序思路及算法实现

8 篇文章 0 订阅

归并排序:通过将两个或两个以上的有序表组合成一个新的有序表这一思想进行排序。

思路:假设初始序列含有n个记录,每个记录长度为1,通过归并合并成[n/2]个长度为2或1的有序序列;如此重复进行归并,到最后就可以得到一个长度为n的有序序列。

代码及注释如下:

void Merge(int *data, int p, int q, int r)			//对数组进行归并
{
	int leftnum, rightnum, i, j, k;
	int *left = NULL, *right = NULL;
	leftnum = q - p + 1;					//确定数组分割点m左方元素的个数
	rightnum = r - q;					//确定数组分割点m右方元素的个数
	
	//给指针分配所要存放的元素的个数大小的内存
	left = new int[sizeof(int)*(leftnum)];
	right = new  int[sizeof(int)*(rightnum)];
	
	for (i = 0; i < leftnum; i++)				//对左数组赋值  
	{
		left[i] = data[p + i];
	}
	for (j = 0; j < rightnum; j++)				//对右数组赋值  
	{
		right[j] = data[q + 1 + j];
	}

	/*重置计数值*/
	i=0;
	j=0;
	k = p;
	while (i<leftnum&&j<rightnum)				//将数组元素值两两比较,并合并到data数组  
	{
		if (left[i] <= right[j])
		{
			data[k] = left[i];
			k++;
			i++;
		}
		else
		{
			data[k] = right[j];
			k++;
			j++;
		}
	}

	while(i < leftnum)					//如果左数组有元素剩余,则将剩余元素合并到data数组  
	{
		data[k] = left[i];
		k++;
		i++;
	}
	while(j < rightnum)					//如果右数组有元素剩余,则将剩余元素合并到data数组  
	{
		data[k] = right[j];
		k++;
		j++;
	}
}

void MSort(int SR[], int s, int t)		<span style="white-space:pre">		</span>//对数组进行归并排序
{
	int m;
	if (s<t)						//如果数组下标s<t,则表示数组可以进行归并排序
	{
		m = (s + t) / 2;			<span style="white-space:pre">	</span>//将数组平分为SR[s···m],SR[m+1···t]
		MSort(SR,s, m);				<span style="white-space:pre">	</span>//对数组SR[s···m]进行归并排序
		MSort(SR,m + 1, t);			<span style="white-space:pre">	</span>//对数组SR[m+1···t]进行归并排序
		Merge(SR, s, m, t);			<span style="white-space:pre">	</span>//将数组SR[s···m],SR[m+1···t]归并到SR[s···t]
	}<span style="white-space:pre">	</span>
}

void MergeSort(int src[],int len)		
{
	MSort(src, 0, len-1);				<span style="white-space:pre">	</span>//调用数组归并函数,数组长度为len,范围为0~len-1
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值