用递归实现: #include<iostream.h> #include <stdio.h> template<class T> void MergeSort(T a[],int left,int right); template<class T> void Merge(T c[],T d[],int l,int m,int r); template<class T> void Copy(T a[],T b[],int l,int r); /*数组实现递归合并排序*/ int main() { char A; do { int const N=100; int a[N]; int n; cout<<"请输入需要排序的数字个数: "; cin >> n; cout<<"请输入 "<< n <<" 个数字:"; for(int i=0;i<n;i++) cin>>a[i];//输入 MergeSort(a,0,n-1);//调用MergeSort函数 cout<<"The sorted array is"<<endl; for(i=0;i<n;i++) printf("%d ",a[i]);//输出a[] cout<<"是否继续(y/n):"<<endl; cin>>A; } while(A!='n' && A!='N'); return 0; } template<class T> void MergeSort(T a[],int left,int right) { if(left < right){ int i = (right + left)/2; T *b=new T[]; MergeSort(a, left, i); //递归处理左半部分 MergeSort(a, i+1, right); //递归处理右半部分 Merge(a, b, left, i, right); //合并数组a[]中a[left]……a[right]的元素,升序存储到数组b[]中 Copy(a,b,left,right); //把b[]中元素复制到a[]中 } } template<class T> void Merge(T c[],T d[], int l, int m, int r) { int i = l, j = m+1, k = l; while(i <= m && j <= r) { if(c[i] <= c[j])d[k++]=c[i++]; //m位置左右两侧的元素相比较,较小的存储在数组d[]中 else d[k++]=c[j++]; // } if(i > m) //将比较后右侧剩余的元素复制到数组d[]中 { for(int q = j; q <= r; q ++) d[k++] = c[q]; } else //将比较后左侧剩余的元素复制到数组d[]中 for(int q = i; q <= m; q ++) d[k++] = c[q]; } template<class T> void Copy(T a[],T b[],int l,int r) { for(int i=l;i<=r;i++) a[i]=b[i]; } 用迭代实现: /*数组实现迭代合并排序*/ #include <stdio.h> #include<iostream.h> void printArray(int *head,int len){ printf("/ndatas:"); int i=1; for(i=1;i<=len-1;i++){ printf("%d ",head[i]);//打印数组head[] } printf("/n"); } /* * * */ void copyArray(int *head,int *tmp,int len){ int i=0; for(i=0;i<=len;i++){ head[i]=tmp[i];//将tmp[]数组中内容复制到head[]中 } } /* * * */ void MergeTwo(int *head,int *tmp,int l,int m,int h){ // printf("/nl:%d m=%d h=%d/n",l,m,h); int i=l,j=m+1,k=l; for(;i<=m&&j<=h;k++){//m位置左右两侧的元素相比较,较小的存储在数组tmp[]中 if(head[i]<=head[j]){ tmp[k]=head[i++];//m左侧元素存入tmp[]中,i后移一位 }else{ tmp[k]=head[j++];//m右侧元素存入tmp[]中,j后移一位 } } while(i<=m){//将比较后左侧剩余的元素复制到数组tmp[]中 tmp[k++]=head[i++]; } while(j<=h){//将比较后右侧剩余的元素复制到数组tmp[]中 tmp[k++]=head[j++]; } } /* * * */ void MergeSortFlag(int *head,int *tmp,int len,int flag){ int i=1; int t; while(i<=(len-2*flag+1)){ MergeTwo(head,tmp,i,i+flag-1,i+2*flag-1);//将原始数据进行分割成小组,数据为:a[i]到a[i+2*flag-1], //并对这2*flag个数据进行升序排序,结果存入tmp[]数组中 i=i+2*flag;//i后移 } // printf("/ni=%d/n",i); if(i+flag-1<len){//对分割后还剩下的小于2*flag的数据块进行操作 MergeTwo(head,tmp,i,i+flag-1,len);//如果分割后剩下的块小于flag时,进行MergeTwo操作(尤其针对奇数个数据时) }else{//如果分割后剩下的块比flag大比2*flag小时,直接复制到tmp数组中 for(t=i;t<=len;t++){ tmp[t]=head[t]; } } // printf("flag:%d",flag); // printArray(tmp,len+1); copyArray(head,tmp,len);//将tmp[]数组中内容复制到head[]中 } /* * * */ void MergeSort(int *head,int *tmp,int len){ int flag=1; while(flag<len){ MergeSortFlag(head,tmp,len,flag);//对数组进行分割成大小为2*flag大小的数据块, //并对每个小数据块进行升序排序,结果存入tmp[]数组中 flag=2*flag; } } /* * 主函数 * */ int main (int argc, char *argv[]) {char A; do { int const N=100; int src[N];//src[n]用来存放需要排序的数据 int tmp[N];//tmp[n]用来存放临时排序数据 int n; int i; cout<<"请输入需要排序的数字个数: "; cin >> n; n=n+1; cout<<"请输入 "<< n-1 <<" 个数字:"; for(i=1;i<n;i++) { tmp[i] = 0;//初始化 cin>>src[i];//输入 } //printArray(src,n);//调用打印数组函数printArray()打印原数组 MergeSort(src,tmp,n-1);//调用排序函数 printArray(tmp,n);//调用打印数组函数printArray()打印已排序数组 getchar(); cout<<"是否继续(y/n):"<<endl; cin>>A; } while(A!='n' && A!='N'); return 0; } 单链表实现归并排序: #include<iostream> using namespace std; //输入链表a,b(非递减),分别遍历显示之后,归并排序 typedef struct Node { int data; struct Node *next; }Node; double cmp(Node *p ,Node *q) //比较链表节点数值大小 {return (p->data - q->data);} Node* mergeSortList(Node *head) //对链表进行归并排序 { Node *p, *q, *tail, *e; int nstep = 1; int nmerges = 0; int i; int psize, qsize; if (head == NULL || head->next == NULL) {return head;} while (1) { p = head; tail = NULL; nmerges = 0; while (p) { nmerges++; q = p; psize = 0; for (i = 0; i < nstep; i++){ psize++; q = q->next; if (q == NULL)break; } qsize = nstep; while (psize >0 || (qsize >0 && q)) { if (psize == 0 ){e = q; q = q->next; qsize--;} else if (q == NULL || qsize == 0){e = p; p = p->next; psize--;} else if (cmp(p,q) <= 0){e = p; p = p->next; psize--;} else{e = q; q = q->next; qsize--;} if (tail != NULL){tail->next = e;} else{head = e;} tail = e; } p = q; } tail->next = NULL; if (nmerges <= 1){return head;} else{nstep <<= 1;} } } void Traverse(Node *List) { Node *p=List; while(p) { cout<<p->data<<' ';; p=p->next; } } int main() { Node * a,*b,*temp,*tail; int k; int count=0; cout<<"输入链表a:(输入负数结束!)"<<endl; do { cin>>k; if(k>=0) { temp=(Node *)malloc(sizeof(Node)); temp->data=k; temp->next=NULL; if(count==0) { a=tail=temp; count++; } else{ tail->next=temp; tail=temp; } } }while(k>=0); cout<<"a链表:"; Traverse(a); cout<<endl; Node *N=mergeSortList(a); //归并排序链表H,得到N cout<<"排序后a链表:"; Traverse(N); //输出链表 N cout<<endl; cout<<"输入'q'结束 "<<endl; while(true) //输入'q'结束 { char c = getchar(); if(c== 'q') exit(0); } return 0; } 自然归并排序实现: #include <iostream> using namespace std; const int N=100; void ScanTarget(int target[], int n, int head[], int tail[]); int CountHead(int head[]); void MergeSort(int a[], int head[], int tail[], int m); void MergePass(int x[], int y[], int s, int a[], int b[], int m); void Merge(int c[], int d[], int l, int m, int r); // int main() { char a; do { int target[N],head[N],tail[N]; int i=0,n,m; for(; i<N; i++) { head[i]=-1; tail[i]=-1; } cout<<"请输入要排序的总数:"<<endl; cin>>n; cout<<"请输入要排序的数列:" <<endl; for(i=0; i<n; i++) cin>>target[i]; ScanTarget(target,n,head,tail); m=CountHead(head); MergeSort(target,head,tail,m); cout<<"排序后:"<<endl; for(i=0; i<n; i++) cout<<target[i]<<" "; cout<<endl; cout<<"是否继续(y/n):"<<endl; cin>>a; } while(a!='n' && a!='N'); return 0; } /*******函数实现*********/// /************************/// void ScanTarget(int target[], int n, int head[], int tail[])//扫描待排数组; { int i,j=0,k=0; head[k]=0; k++; for(i=1;i<n;i++) { if(target[i-1]>target[i]) { tail[j++]=i-1; head[k++]=i; } } tail[j]=n-1; } / int CountHead(int head[])//求长度; { int i(0); while(head[i]!=-1) { i++; } return i; } / void MergeSort(int a[], int head[], int tail[], int m) { int b[N]; int s=1; while(s<m) { MergePass(a,b,s,head,tail,m); s+=s; MergePass(b,a,s,head,tail,m); s+=s; } } // void MergePass(int x[], int y[], int s, int a[], int b[], int m) { int i=0; while(i <= m-2*s) { Merge(x,y,a[i],b[i+s-1],b[i+2*s-1]); i=i+2*s; } if(i+s < m) { Merge(x,y,a[i],b[i+s-1],b[m-1]); } else { for(int j=i; j<m; j++) for(int k=a[j]; k<=b[j]; k++) y[k]=x[k]; } } /// void Merge(int c[], int d[], int l, int m, int r) { int i,j,k; i=l; j=m+1; k=l; while((i<=m) && (j<=r)) { if( c[i] <= c[j] ) d[k++]=c[i++]; else d[k++]=c[j++]; } if( i>m ) { for(int q=j; q<=r; q++) d[k++]=c[q]; } else { for(int q=i; q<=m; q++) d[k++]=c[q]; } } /*****程序end*****/ ///