2-路归并排序中的核心操作是将一位数组中的前后相邻的两个有序序列合并为一个有序序列。
具体代码和测试如下:
#include <iostream> using namespace std; #include<list> #define M 21 typedef int SqList[M]; /*归并排序是又一类不同的排序方法。归并的含义是将两个或两个 以上的有序表组合成一个新的有序表。 2-路归并排序中的核心操作是将一位数组中的前后相邻的两个有序序列合并 为一个有序序列*/ void Merge(SqList &L,int left,int mid,int right) //归并排序 { 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 = {53,24,35,56,32,78,99}; 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; }
原文地址:http://blog.csdn.net/qaz3171210/article/details/46598837