归并排序

归并排序的实现.时间复杂度是O(nlgn),空间复杂度是O(n) + O(lgn).

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 void merge_array(int *, int, int, int);
 6 void merge_sort(int *, int, int);
 7 
 8 int main(void)
 9 {
10 
11     int A[6] = {5,1,2,6,9,3};
12     merge_sort(A, 0, 5);
13 
14     for (int i=0; i<6; ++i)
15     {
16         cout << A[i] << " ";
17     }
18 
19     cout << endl;
20     return 0;
21 }
22 
23 void merge_sort(int A[], int p, int r)
24 {
25     if (p < r)
26     {
27         int mid = (p + r) / 2;
28         merge_sort(A, p, mid);
29         merge_sort(A, mid+1, r);
30         merge_array(A, p, mid, r);
31     }
32 }
33 
34 void merge_array(int A[], int p, int mid, int r)
35 {
36     int *array1 = NULL;
37     int *array2 = NULL;
38     
39     int array1_len = 0;
40     int array2_len = 0;
41     
42     int i, j;
43 
44     array1_len = mid - p + 1;
45     array2_len = r - mid;
46 
47     array1 = new int[array1_len];
48     array2 = new int[array2_len];
49     
50     for (i=0; i<array1_len; ++i)
51     {
52         array1[i] = A[i+p];
53     }
54 
55     for (j=0; j<array2_len; ++j)
56     {
57         array2[j] = A[mid+j+1];    
58     }
59 
60     for (i=0, j=0; i<array1_len && j<array2_len;)
61     {
62         if (array1[i] < array2[j])
63         {
64             A[p++] = array1[i++];
65         }
66         else
67         {
68             A[p++] = array2[j++];
69         }
70     }
71 
72     while(i < array1_len)
73     {
74         A[p++] = array1[i++];
75     }
76 
77     while(j < array2_len)
78     {
79         A[p++] = array2[j++];
80     }
81     
82     delete [] array1;
83     delete [] array2;
84 }
原文地址:https://www.cnblogs.com/yyxayz/p/4137439.html