template<class T> void Merge(T c[], T d[], int l, int m, int r) { // 把 c[l:m]] 和 c[m:r] 归并到 d[l:r]. int 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]; } } template<class T> void MergePass(T x[], T y[], int s, int n) { int i = 0; while (i <= n - 2 * s) { Merge(x, y, i, i+s-1, i+2*s-1); i = i + 2 * s; } //剩下不足2s个元素 if (i + s < n) { Merge(x, y, i, i+s-1, n-1); } else { for (int j = i; j <= n-1; j++) y[j] = x[j]; } } template<class T> void MergeSort(T a[], int n) { //使用归并排序算法对a[0:n-1]进行排序 T *b = new T [n]; int s = 1; // 段的大小 while (s < n) { MergePass(a, b, s, n); s += s; MergePass(b, a, s, n); s += s; } delete [] b; } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kongbu0622/archive/2009/10/09/4647959.aspx