归并排序

归并排序重点在治,即合并两个有序数组:

 1 void merge(int A[], int p, int q, int r)
 2 {
 3     int i = 0, j = 0, k = p;
 4     int m = q - p + 1;
 5     int n = r - q;
 6     int *S = new int[m];
 7     int *T = new int[n];
 8     for (i = 0; i < m; i++)
 9         S[i] = A[p + i]; 
10     for (j = 0; j < n; j++)
11         T[j] = A[q + j + 1]; 
12 
13     i = j = 0;
14     while ((i < m) && (j < n)) 
15         if (S[i] < T[j])
16             A[k++] = S[i++];
17         else
18             A[k++] = T[j++];
19     while (i < m)
20         A[k++] = S[i++];
21     while (j < n)
22         A[k++] = T[j++];
23     
24     delete[] S;
25     delete[] T;
26 }

有了merge函数,就可以使用up-down的方式分治,使用递归解决。

void merge_sort(int A[], int p, int r)
{
    int q;
    if (p < r)
    {
        q = (p + r) / 2;
        merge_sort(A, p, q);
        merge_sort(A, q + 1, r);
        merge(A, p, q, r);
    }
}

 或者采用bottom-up的方法,非递归解决。

 1 void merge_sort(int A[], int p, int r)
 2 {
 3     int step, low, mid, high;
 4 
 5     for (step = 1; step <= r; step *= 2)
 6     {   
 7         low = p;
 8         while (low + step <= r)
 9         {   
10             mid = low + step - 1;
11             high = mid + step;
12             if (high >= r)
13                 high = r;
14             merge(A, low, mid, high);
15             low = high + 1;
16         }   
17     }   
18 }
原文地址:https://www.cnblogs.com/ym65536/p/4079556.html