归并排序

 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 }
posted @ 2014-09-06 16:50  yaoC  阅读(271)  评论(0)    收藏  举报