归并排序

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

 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 sort就很简单了。

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);
    }
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。