归并(Merge)排序法:将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列
在执行过程中一直调用一个划分过程,直到子序列为空或者只有一个元素为止,共需log2n次递归,在归并的过程中依次归并长度为2、4…..的子序列,直到整个序列有序
归并图示
归并的实现
#define MAXSIZE 20 //默认定义数据大小为20
#define T int
typedef T Seqlist[MAXSIZE];
void merge(Seqlist &L,Seqlist &sq,int left,int mid,int right)//合并
{
for(int i = left;i<=right;++i) //赋值
{
sq[i] = L[i];
}
int s1 = left;
int s2 = mid + 1;
int k = left;
while(s1<=mid && s2 <=right)
{
if(sq[s1]<=sq[s2])
{
L[k++] = sq[s1++];
}
else
{
L[k++]= sq[s2++];
}
}
while(s1 <= mid)//左边还有值,而右边已经到达界限
{
L[k++] = sq[s1++];
}
while(s2 <= right)
{
L[k++] = sq[s2++];
}
}
void Merge_sort(Seqlist &L,Seqlist &sq,int left,int right)
{
if(left >= right)
return;
int mid = (left + right)/2;//将数据分为两部分
Merge_sort(L,sq,left,mid);//对左边数据进行归并排序
Merge_sort(L,sq,mid+1,right);//对右边数据进行归并排序
merge(L,sq,left,mid,right);//将左右两部分数据进行合并
}
归并的测试文件
void main() //归并排序测试
{
Seqlist L = {16,33,9,8,25,21,3,49,5};
Seqlist sq;
int n = 9;
Merge_sort(L,sq,0,8);
for(int i = 0;i < n;++i)
{
cout<<L[i]<<" ";
}
}
归并排序的主要问题是它需要一个与原数据一样大的辅助空间。归并排序是一种稳定的排序方法。