归并排序

 1  /* *
 2   * 归并排序
 3   * yaoC 2014-09-03
 4   * Θ(nlg(n))
 5    */
 6 
 7 #include<iostream>
 8  using  namespace std;
 9 
10  #define infinity 999999 // 定义无穷大
11 
12  /* *
13   * [merge 合并]
14   * @param A [待合并数组,也是合并后的数组]
15   * @param p [数组第一部分开始下标]
16   * @param q [数组第一部分结束下标]
17   * @param r [数组第二部分结束下标]
18    */
19  void merge( int* A, int p, int q, int r)
20 {
21      // 分为两个数组,增加最后一位值为无穷大
22       int n1=q-p+ 1;
23      int n2=r-q;
24      int* A1= new  int[n1+ 1];
25      int* A2= new  int[n2+ 1];
26      for ( int i =  0; i < n1; i++)
27         A1[i]=A[p+i];
28     A1[n1]=infinity;
29      for ( int i =  0; i < n2; i++)
30         A2[i]=A[q+ 1+i];
31     A2[n2]=infinity;
32      // 合并
33       int i= 0,j= 0,k=p;
34      while(k<=r)
35     {
36          if(A1[i]<A2[j])
37         {
38             A[k]=A1[i];
39             i++;
40         }
41          else
42         {
43             A[k]=A2[j]; 
44             j++;
45         }
46         k++;
47     }
48 }
49  /* *
50   * [mergeSort 分解]
51   * @param A [待排序数组]
52   * @param p [数组开始下标]
53   * @param r [数组结束下标]
54    */
55  void mergeSort( int* A, int p, int r)
56 {    
57      int q=(p+r)/ 2;
58      // 将数组一分为二
59       if(p<q)
60     {
61         mergeSort(A,p,q);
62         mergeSort(A,q+ 1,r);
63     }
64     merge(A,p,q,r); // 合并两个数组
65  }
66  // test
67  int main()
68 {
69      int num =  0;  
70     cout <<  " 个数: ";
71     cin >> num;
72      int* p =  new  int[num];
73     cout <<  " 数值: ";
74      for ( int i =  0; i < num; i++)
75         cin >> p[i];
76     mergeSort(p, 0,num- 1);
77     cout <<  " after sorting: ";
78      for ( int i =  0; i < num; i++)
79         cout << p[i] <<  "   ";
80     cout << endl;
81 }

你可能感兴趣的:(归并排序)