二路归并排序是归并排序的一种基本方式。归并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。
以序列11,24,17,7,22,36,27,10,19,18 为例
初始时为:11 24 17 7 22 36 27 10
第一次归并(两两合并):{11,24}、 {7,17}、 {22,36}、{10,27}
第二次归并:{7,11,17,24}、{10,22,27,36}
第三次归并:{7,10,17,22,24,27,36}
下面代码是用C++写的例子:
#include<iostream>
using namespace std;
#define MaxSize 100
void Merge(int source[],int target[],int start,int mid,int end)
{
int j,k,n;
for(j=mid+1,k=start;start<=mid && j<=end;k++)
{
if (source[start]<source[j])
target[k]=source[start++];
else
target[k]=source[j++];
}
if(start<=mid)
{
for(n=0;n<=mid-start;n++)
target[k+n]=source[start+n];
}
if(j<=end)
{
for(n=0;n<=end-j;n++)
target[k+n]=source[j+n];
}
}
void MergeSort(int source[],int target[],int start, int end)
{
int mid;
int tmp[MaxSize];
if(start==end)
target[start]=source[start];
else
{
mid=(start+end)/2;
MergeSort(source,tmp,start,mid);
MergeSort(source,tmp,mid+1,end);
Merge(tmp,target,start,mid,end);
}
}
void main()
{
int a[10]={11,24,17,7,22,36,27,10,19,18};
int b[10]={0};
MergeSort(a,b,0,9);
for(int i=0;i<10;i++)
{
cout<<b[i]<<endl;
}
}