今天,再来介绍一种排序方法,归并排序。
什么意思?
把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堆,有序的数,那么从最最上面,比较,看到谁小,就直接取出,直到有一堆为空,剩下的,直接放过去,这不就排好了
下面给大家附一个,递归算法的地址,有兴趣看看点击打开链接
关于递归的合并,我简单说几句,假如你不理解递归过程,可以这样理解,找到中间的某个位置,调用归并算法整理前半个子序列,调用归并算法整理后半个子序列,然后把它们合并就好了。
但是在调用合并的时候,本身又在调用自己,所以你可以抛开这个过程,等你见多了,你就理解了