基本排序之归并排序

今天,再来介绍一种排序方法,归并排序。

什么意思?

把n个长度的线性表看成n个长度为1的有序表,然后,两两归并,也称2-路归并排序。

它的实现有递归形式的,还有非递归形式的。

我这里主要说,非递归形式的算法。

先看代码,我再来解释。

#include<iostream>
using namespace std;
template <class T>
void merge(T p[],int n){
	int m,k,j,low,high,mid;
	T *a;
	a=new T[n];
	m=1;
	while(m<n){
	k=2*m;
	for(j=1;j<=n;j=j+k){
	low=j;high=j+k-1;mid=j+m-1;
	if(high>n) high=n;
	if(high>mid) merg(p,low,mid,high,a);
	}
	m=k;
	}
	delete a;
	return;
}

template <class T>
merg(T p[],int low ,int mid ,int high ,T a[]){
	int i,j,k;
	i=low;j=mid+1;k=low;
	while((i<=mid)&&(j<=high)){
		if(p[i-1]<=p[j-1]){a[k-1]=p[i-1];i=i+1;}
		else
		{a[k-1]=p[j-1];j=j+1;}
		k=k+1;
	}
	if(i<=mid)
		for(j=i;j<=mid;j++)
		{a[k-1]=p[j-1];k=k+1;}
	else
		if(j<=high)
			for(i=j;i<=high;i++)
			{a[k-1]=p[i-1];k=k+1;}
		for(i=low;i<=high;i++)
			p[i-1]=a[i-1];
		return 0;
}
这里有个merge函数,以及merg函数,其中,merge函数就是非递归形式的,归并算法,它的作用干什么?

找到,low,high,以及mid这三个指针的位置。

merg函数就是合并,把2个有序子序列和成大的有序序列,如何合并?

我就举个非常通俗的例子,比如,桌子上放了2堆,有序的数,那么从最最上面,比较,看到谁小,就直接取出,直到有一堆为空,剩下的,直接放过去,这不就排好了

下面给大家附一个,递归算法的地址,有兴趣看看点击打开链接

关于递归的合并,我简单说几句,假如你不理解递归过程,可以这样理解,找到中间的某个位置,调用归并算法整理前半个子序列,调用归并算法整理后半个子序列,然后把它们合并就好了。

但是在调用合并的时候,本身又在调用自己,所以你可以抛开这个过程,等你见多了,你就理解了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值