C语言数据结构与算法---归并排序

归并排序

1.基础理解

  1. 基本思想:将两个或两个以上的有序子序列“归并”为一个有序序列。
  2. 在内部排序中,通常采用的是 2-路归并排序 --------即将两个位置相邻的有序子序列 R[l…m] 和 R[m+1…n] 贵宾房为一个有序序列 R[l…n]

2.算法实现

将两个有序的子系列归并为一个序列

//将 R[low...mid],R[mid...high]归并为有序表T[low...high]
void Merge(int *R,int *T,int low,int mid,int high)
{
	int i = low;
	int j = mid+1;
	int k = low;

	//将 R 中的记录从小到大并入 T 中
	while(i <= mid && j <= high)
	{
		if(R[i].key <= R[j].key)
		{
			T[k] = R[i++];
			k++;
		}
		else
		{
			T[k] = R[j++];
			k++;
		}
	}
	//当其中一个子序列已经比较完时
	while(i <= mid)
	{
		T[K++] = R[i++];
	}
	while(j <= high)
	{
		T[K++] = R[j++];
	}
}
//将当前序列一分为二
void Msort(int *R,int *T,int loe,int high)
{
	int S[MAXSIZE];
	if(low == high)
	{
		T[low] = T[high];
	}
	else
	{
		mid = (low + high)/2;
		Msort(R,S,low,high);//对子序列 R[low...mid] 递归归并排序,结果放入 S[low...mid]
		Msort(R,S,mid+1,high);//对子序列 R[mid...high] 递归归并排序,结果放入 S[mid...high]
		Merge(S,T,low,mid,high);//将S[low...mid]和S[mid...high]归并到 T
	}
}

//对顺序表 L 归并排序
void Mergesort(Sqlist *L)
{
	Msort(L->r,L->r,1,L->length);
}

利用图示理解Msort函数的递归
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值