yishujixiaoxiao 2020-04-10
看着算法书有点懵T_T
参照https://blog.csdn.net/u011197534/article/details/78368580
自顶向下即是归并排序,参考我之前的归并排序,如图
自底向上,就是两两归并、四四归并、88归并,如下图:
书上的伪代码:
/* 输入:n个元素的数组A[1...n] 输出:按非降序排列的数组A[1...n] t <- 1 while t < n s <- t; t <- 2s; t <- 0 while i+t <= n merge(A, i+1, i+s, i+t) i <- i+t end while if i+s < n then merge(A, i+1, i+s, n) end while */
完整代码:
void merge(int A[], int l, int mid, int r) { int help[r-l+1]; //辅助数组 int i = 0; int lIndex = l; int rIndex = mid + 1; while(lIndex<=mid && rIndex<=r) { help[i++] = A[lIndex] < A[rIndex] ? A[lIndex++] : A[rIndex++]; } while(lIndex<=mid) { help[i++] = A[lIndex++]; } while(rIndex<=r) { help[i++] = A[rIndex++]; } for(i = 0; i < r-l+1; i++) { A[l+i] = help[i]; } } void downUpSort(int A[], int n) { int i = 1; while(i < n) //for(int i=1; i<n; t = 2 * i) { int s = i; i = 2 * s; //归并子数组序列扩大一倍 int j = 0; //子区间归并 while(i+j <= n) //for(int j = 0; j < n-i; j = j+2*i) { merge(A, j, j+s-1, j+i-1); j = j+i; } if(j+s < n) merge(A, j, j+s-1, n-1); } } int main() { int A[9] = {5,4,8,2,9,3,1,6,7}; cout << "before sort: "; for (int i = 0; i < 9; i++) cout << A[i] << " "; cout << endl; downUpSort(A, 9); cout << "after sort: "; for (int i = 0; i < 9; i++) cout << A[i] << " "; cout << endl; }
结果如下: