参照《数据结构》(C语言版)严蔚敏著
以下为2-路归并排序算法的源代码
#include<iostream.h> struct SqList { int r[100]; int length; }; void Merge(SqList SR, SqList &TR, int i, int m, int n); void MSort(SqList SR, SqList &TR1, int s, int t); void MergeSort(SqList &L); int main(void) { SqList L; L.r[1]=49; L.r[2]=38; L.r[3]=65; L.r[4]=97; L.r[5]=76; L.r[6]=13; L.r[7]=27; L.r[8]=49; L.length=8; MergeSort(L); for(int i=1;i<=L.length;i++) { cout << L.r[i] << " "; } cout << endl; return 0; } void Merge(SqList &SR, int begin, int mid, int end) {//将有序的SR[i..m]和SR[m+1..n]归并为有序的SR[i..n] int j=0,k=0; int i=begin; SqList TR; for(j=mid+1,k=begin;i<=mid && j<=end; k++) { if(SR.r[i]<=SR.r[j]) TR.r[k]=SR.r[i++]; else TR.r[k]=SR.r[j++]; } while(i<=mid) TR.r[k++]=SR.r[i++]; while(j<=end) TR.r[k++]=SR.r[j++]; for(int ii=begin;ii<=end;ii++) SR.r[ii]=TR.r[ii]; } void MSort(SqList &SR, int s, int t) {//将SR[s..t]归并排序为TR1[s..t] if(s<t) { int m=(s+t)/2; MSort(SR, s, m); MSort(SR, m+1, t); Merge(SR, s, m, t); } } void MergeSort(SqList &L) {//对顺序表L作归并排序 MSort(L, 1, L.length); }
“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表
2-路归并排序中的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列,即Merge(...)函数
与快速排序和堆排序相比,归并排序的最大特点是,它是一种稳定的排序方法。但在一般的情况下,很少利用2-路归并排序法进行内部排序