算法思想:首先把一个数组中的元素,按照某一方法,先拆分了之后,按照一定的顺序各自排列,然后再归并到一起,使得归并后依然是有一定顺序的 。
算法可自顶向下拆分数组也可以自底向上拆分数组合并
自底向上的归并排序有对索引依赖少的优势,对于链表来说比较适合
//自底向上的归并排序 template<typename T> void mergeSortBU(T arr[],int n){ for(int sz = 1;sz <=n;sz += sz) for(int i=0;i+sz<n;i+=sz + sz) //对arr[i..i+sz-1]和arr[i+sz..i+2*sz-1]进行归并 __mearge(arr,i,i+sz-1,min(i+sz+sz-1,n-1)); }
//归并排序子函数,将arr[l...mid]和arr[mid+1...r]两部分进行归并 template<typename T> void __mearge(T arr[],int l,int mid,int r){ T aux[r-l+1]; for(int i=l;i<=r;i++) aux[i-l] = arr[i]; int i =l,j=mid+1; for (int k=l;k<=r;k++) if(i >mid){ arr[k] = aux[j-l]; j++; }else if(j>r) { arr[k] = aux[i-l]; i++; } if(aux[i-l] <aux[j-l]){ arr[k] = aux[i-l]; i++; }else { arr[k] = aux[j-l]; j++; } }