递归方法:左边进行递归的有序子序列合并,右边进行有序子序列合并,然后对当前的已经完成有序合并的左右两部分进行合并。
(记住:在递归中后调用的先返回,先调用的后返回)
非递归方法:用len标注进行合并的子数组的长度,初始长度为1,然后两两合并,最后可能会剩下不足2*len的子数组,当不足len的,直接复制过去,>len得,再进行一次到数组末尾的合并。
// SortAlri.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" /* 对两方都有序的数组进行合并, */ templatevoid Merge(type * a,type * b,int left,int mid,int right){ int i=left,j=mid+1; int k=left; while(i<=mid&&j<=right){ if(a[i]<=a[j]){ b[k]=a[i]; i++;k++; }else { b[k]=a[j]; j++;k++; } } if(i<=mid){ for( ;i<=mid;i++,k++) b[k]=a[i]; }else{ for(;j<=right;j++,k++) b[k]=a[j]; } } template void None_MergeSort(type * a,type *b,int lenth){ //进行合并的长度,刚开始为1进行两两合并,然后进行长度为2两两合并,直到剩下只有两个有序数组进行合并 int len=1; while(len void WholeMerge(type * sourceTable,type * mergedTable,int lenth,int len){//lenth:整个数组的长度-1(,len:进行合并的子数组长度 int i=0; while(i<=lenth-2*len){ Merge(sourceTable,mergedTable,i,i+len-1,i+2*len-1); i+=2*len; } if(i+lenvoid MergeSort(type * a,type * b,int left,int right){ if(left (a,b,11); //MergeSort (a,b,0,10); for(int i=0;i<=10;i++) cout<