假设初始序列含有n个记录,则可看成是n个有序子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。
2-路归并排序中的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列。
#include <iostream>
using namespace std;
#include<list>
#define M 21
typedef int SqList[M];
void Merge(SqList &L,int left,int mid,int right) //2-路归并排序
{
SqList L1; //定义一个新数组
int i = left, j = mid+1, p = 0; //分成两部分
while(i <= mid && j <= right) //两部分序列开始比较
{
if(L[i] <= L[j]) //排序
{
L1[p++] = L[i++]; //插入到新的空间内
}
else
{
L1[p++] = L[j++];
}
}
while(i <= mid) //左半部分序列多
{
L1[p++] = L[i++];
}
while(j <= right) //右半部分序列多
{
L1[p++] = L[j++];
}
for(p = 0,i = left;i <= right;++p,++i) //重新拷贝到原数组中
{
L[i] = L1[p];
}
}
void MSort(SqList &L,int left,int right)
{
if(left >= right) //长度小于等于1
{
return;
}
else
{
int mid = (left+right)/2; //中值
MSort(L,left,mid); //左排序
MSort(L,mid+1,right); //右排序
Merge(L,left,mid,right); //归并
}
}
void main()
{
SqList sq = {49,38,65,97,76,13,27};
for(int i = 0;i < 7; ++i)
{
cout<<sq[i]<<" ";
}
cout<<endl;
MSort(sq,0,6);
for(i = 0;i < 7; ++i)
{
cout<<sq[i]<<" ";
}
cout<<endl;
}