X周

导航

归并排序-分治法

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<climits>
 4 using namespace std;
 5 
 6 /*
 7  函数名:Merge 
 8  功能: 合并有序子序列a[low..mid],a[mid+1..high]为一个有序序列 
 9  */ 
10  void Merge(int a[],int low,int mid,int high){ 
11      int sub1_len=mid-low+1;                     // 计算子序列1的长度 
12      int sub2_len=high-mid;                      // 计算子序列2的长度
13      int *L=NULL,*R=NULL;
14      L = (int *)malloc(sizeof(int)*(sub1_len+1));//L和R为暂存序列,分别保存待排序的左右子序列 
15      R = (int *)malloc(sizeof(int)*(sub2_len+1)); 
16      for(int i=0;i<sub1_len;++i){                 //分别将子序列复制到L和R 
17          L[i]=a[low+i];                            //从low开始 
18      }
19      for(int j=0;j<sub2_len;++j){
20          R[j]=a[mid+1+j];                        //从mid+1开始 
21      } 
22      L[sub1_len]=1000;                              //1000为哨兵,可设为待排序的数据域的最大值 
23      R[sub2_len]=1000;                            //如果不设置哨兵,下面还需判断L、R是否为空
24      int i=0;
25      int j=0;                             
26      for(int k=low;k<=high;++k){                    //将两个已排序子序列元素的较小的元素依次放入排序序列 
27          if(L[i]<=R[j]){
28              a[k]=L[i++];
29          }
30          else {
31              a[k]=R[j++];
32          }    
33      }
34  }
35  void Merge1(int a[],int low,int mid,int high){
36       int sub1_len=mid-low+1;                      
37      int sub2_len=high-mid;                      
38      int *L=NULL,*R=NULL;
39      L = (int *)malloc(sizeof(int)*(sub1_len));
40      R = (int *)malloc(sizeof(int)*(sub2_len)); 
41      for(int i=0;i<=sub1_len-1;++i){                
42          L[i]=a[low+i];                          
43      }
44      for(int j=0;j<=sub2_len-1;++j){
45          R[j]=a[mid+1+j];                       
46      } 
47       int i= 0; 
48      int j =0;
49       int k= low;
50       while(i<sub1_len&&j<sub2_len){                //注意这里的循环条件,不是k<=high!!! 
51           if(L[i]<=R[j])
52           a[k++] = L[i++];
53         else 
54           a[k++] = R[j++]; 
55         
56       }
57       while(i<sub1_len)
58          a[k++]= L[i++];
59       while(j<sub2_len)
60          a[k++]= R[j++];
61      
62  }
63  /*
64  函数名:Mergesort
65  功能: 排序序列a的low至high段
66  方式: 递归 
67  */ 
68  void Mergesort(int a[],int low,int high){
69      int  mid;
70      if(low<high){
71          mid=int((low+high)/2);
72          Mergesort(a,low,mid);
73          Mergesort(a,mid+1,high);
74          Merge1(a,low,mid,high);
75      }    
76  } 
77 
78 int main(){
79      int num;
80      while(1){    
81          cin>>num;
82          int *array=NULL;
83          array = (int *)malloc(sizeof(int)*(num));
84         
85          for(int i=0;i<num;i++)    cin>>array[i]; 
86         
87          Mergesort(array,0,num-1); 
88          
89         
90          for(int i=0;i<num;i++)    cout<<array[i]<<" ";
91      }
92      return 0;
93  }

 

posted on 2013-05-13 08:31  X周  阅读(106)  评论(0)    收藏  举报