归并是指将两个或两个以上的有序表组合成一个新的有序表。
归并排序思想:对于含有n个记录的序列,可以看成是n个有序的子序列,每个子序列的长度为1,然后两两合并,得到N/2(上取整)个有序的含有两个记录的子序列,重复以上合并过程,直到得到一个含有N个记录的序列为止。
对初始序列进行分割得到含有一个记录的子序列的过程可以看做是从根到叶子构建二叉树的过程;对有序的子序列进行合并的过程可以看做是从叶子到根构建二叉树的过程,这样理解比较简单。
#include<iostream>
#include<vector>
using namespace std;
void Merge(vector<int> &SR,int s,int m,int t){
vector<int> TR(SR.size(),0);
vector<int>::iterator iter,iter1;
int i,j;
for(i=s;i<=t;i++)
TR[i]=SR[i]; //将待合并的两个子序列先存放在TR中,在合并到SR中相应位置
iter=TR.begin()+s;
iter1=TR.begin()+m+1;
j=s;
while(iter<=TR.begin()+m&&iter1<=TR.begin()+t){
if(*iter<*iter1){
SR[j]=*iter;
iter++;
}else{
SR[j]=*iter1;
iter1++;
}
j++;
}
for(;iter<=TR.begin()+m;iter++){
SR[j]=*iter;
j++;
}
for(;iter1<=TR.begin()+t;iter1++){
SR[j]=*iter1;
j++;
}
}
void MergeSort(vector<int> &SR,int s,int t){
vector<int> TR;
vector<int>::iterator iter;
int m;
if(s<t){ //将待排序的序列进行分割,直到每个子序列中剩一个元素时进行合并
m=(s+t)/2; //先将待排序列分割成两部分
MergeSort(SR,s,m); //递归对左半部分进行分割
MergeSort(SR,m+1,t); //递归对右半部分进行分割
Merge(SR,s,m,t);
for(iter=SR.begin();iter!=SR.end();iter++)
cout<<*iter<<" ";
cout<<endl;
}
}
void main(){
vector<int> SR,TR1,TR2;
int v;
vector<int>::iterator iter;
cout<<"请输入待排序的序列:";
while(cin>>v)
SR.push_back(v);
MergeSort(SR,0,SR.size()-1);
cout<<"排序之后的序列为:";
for(iter=SR.begin();iter!=SR.end();iter++)
cout<<*iter<<" ";
cout<<endl;
}