呵呵, 算法描述直接看头文件中的吧
c++实现:
#ifndef sort_merge__hh #define sort_merge__hh /** 合并排序, O(nlgn), 但是每次递归需要分配 n MERGE-SORT(A, start, size) if (size > 0) { m = size/2; // 二分 MERGE-SORT(A, start, m); MERGE-SORT(A, start+m, size-m); MERGE(A, start, m, size-m); } MERGE(A, start, lsize, rsize) n1 = lsize; n2 = rsize; L[] = alloc(n1); R[] = alloc(n2); for i = 0 to n1 L[i] = A[i] for j = 0 to n2 R[j] = A[j] i = j = 0; for k = start to start+lsize+rsize // 下面的判断使用 lsize, rsize 检查 L, R 是否越界, 使用无穷大, 更好 if i < lsize and j < rsize if L[i] <= R[j] A[k] = L[i++]; else A[k] = R[j++]; else if i == lsize A[k] = R[j++]; else A[k] = L[i++]; */ template<class T> inline void __merge(T *A, size_t start, size_t lsize, size_t rsize) { size_t i, j; size_t n1 = lsize; size_t n2 = rsize; T *L = new T[n1]; T *R = new T[n2]; for (i = 0; i < lsize; i++) L[i] = A[start+i]; for (j = 0; j < rsize; j++) R[j] = A[start+lsize+j]; i = j = 0; for (size_t k = start; k < start+lsize+rsize; k++) { if (i < lsize && j < rsize) { if (L[i] <= R[j]) { A[k] = L[i++]; } else { A[k] = R[j++]; } } else { if (i == lsize) { A[k] = R[j++]; } else { A[k] = L[i++]; } } } delete []L; delete []R; } template<class T> inline void algo_sort_merge (T *array, size_t start, size_t size) { if (size > 1) { size_t m = size / 2; algo_sort_merge<T>(array, start, m); algo_sort_merge<T>(array, start+m, size-m); __merge<T>(array, start, m, size-m); } } #endif // merge.h