归并排序的迭代表示/自底向上归并

 1 #include <iostream>
 2 #include <stdlib.h>
 3 
 4 using namespace std;
 5 #define N 100
 6 
 7 //合并序列中的s:m-1和m:e两个子序列
 8 void merge(int array[], int s, int m, int e) {
 9     int ta[N], i, j, k = 0;    
10     i = s;
11     j = m;
12     while (i < m && j <= e) {
13         if (array[i] < array[j]) {
14             ta[k++] = array[i++];
15         } else {
16             ta[k++] = array[j++];
17         }
18     }
19     while (i < m) {
20         ta[k++] = array[i++];
21     } 
22     while (j <= e) {
23         ta[k++] = array[j++];
24     }
25     i = s;
26     k = 0;
27     while (i <= e) {
28         array[i++] = ta[k++];
29     }
30 }
31 
32 //自底向上归并
33 void buttomUpSort(int array[], int length) {
34     int i = 1, s, m, e, t;
35     while ((length / i) >= 1) {    //依次从2, 4, 8......至序列被分成两部分向上归并
36         s = 0;
37         while (1) {
38             m = s + i;
39             if (m >= length)//若此段序列孤立(及原序列被划分成奇数个部分,最后一部分不做合并,进入到下一次合并)
40                 break;
41             else {
42                 e = ((t = m + i - 1) < length)?t:length - 1;//最后一段序列的截止位为length-1
43                 merge(array, s, m, e);
44             }
45             s += i*2;
46         }
47         i *= 2;
48     }
49 }
50 
51 int main(int args, char **argv) {
52     int array[N];
53     for (int i = 0; i < N; ++i) {
54         array[i] = rand() % 100;
55     }
56     for (int i = 0; i < N; i++) {
57         cout << '\t' << array[i];
58     }
59     cout << endl;
60     buttomUpSort(array, N);
61     for (int i = 0; i < N; i++) {
62         cout << '\t' << array[i];
63     }
64     return 0;
65 }
原文地址:https://www.cnblogs.com/Sunlnx/p/3402518.html