归并排序模板

 

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int maxn=100005;
 5 int n;
 6 int a[maxn];
 7 void merge(int L,int M,int R)
 8 {
 9 const int Sizeof_Left=M-L+1;
10 const int Sizeof_Right=R-M;
11 int left[Sizeof_Left];
12 int right[Sizeof_Right];
13 for(int i=L;i<=M;i++)
14 left[i-L]=a[i];
15 for(int i=M+1;i<=R;i++)
16 right[i-M-1]=a[i];
17 
18 int i=0;
19 int j=0;
20 int k=L;
21 while(i < Sizeof_Left&&j < Sizeof_Right)
22 {
23 if(left[i] < right[j])
24 {
25 a[k]=left[i];
26 i++,k++;
27 }
28     else
29 {
30 a[k]=right[j];
31 j++;
32 k++;
33 }
34 }
35 while(i < Sizeof_Left) a[k++]=left[i++];
36 while(j < Sizeof_Right) a[k++]=right[j++];
37 }
38 void mergesort(int L,int R)
39 {
40 if(L == R) return;
41 
42 int M=(L+R)>>1;
43 mergesort(L,M);
44 mergesort(M+1,R);
45 merge(L,M,R);
46 }
47 int main()
48 {
49 printf("n=");
50 cin>>n;
51 printf("array[]=");
52 for(int i=0;i<n;i++)
53 scanf("%d",&a[i]);
54 mergesort(0,n-1);
55 printf("solution:\n");
56 for(int i=0;i<n;i++)
57 printf("%d ",a[i]);
58 printf("\n");
59 return 0;
60 }

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<vector>
 7 #include<queue>
 8 #define ms(x,n) memset(x,n,sizeof x);
 9 #include<bits/stdc++.h>
10 const int maxn=1005;
11 const int inf=0x3f3f3f3f;
12 int a[maxn];//待排序列,临时数组
13 int n,m,tmp,num;
14 using namespace std;
15 void merges(int a[],int b[],int l,int r,int rightend)
16 {
17     //左起始位置,右起始位置,右终点位置
18     int leftend=r-1;
19     tmp=l;//存放结果的数组的初始位置
20     num=rightend-l+1;//此次归并的元素总个数
21     while(l<=leftend&&r<=rightend)
22     {
23         if(a[l]<=a[r])
24             b[tmp++]=a[l++];
25             else
26             b[tmp++]=a[r++];
27     }
28     while(l<=leftend)
29         b[tmp++]=a[l++];
30     while(r<=rightend)
31         b[tmp++]=a[r++];
32     for(int i=0;i<num;i++,rightend--)
33         a[rightend]=b[rightend];
34 }
35 void msort(int a[],int b[],int l,int rightend)
36 {
37     int mid;//=(l+rightend)>>1;
38     if(l<rightend)
39     {
40         mid=(l+rightend)>>1;
41         msort(a,b,l,mid);
42         msort(a,b,mid+1,rightend);
43         merges(a,b,l,mid+1,rightend);
44     }
45 }
46 void Merge_sort(int a[],int n)//函数统一的接口
47 {
48     //int *b;
49     //b=malloc(n*sizeof(int));
50     int *b=new int[n];
51     msort(a,b,0,n-1);
52     free(b);
53 }
54 int main()
55 {
56     cin>>n;
57     for(int i=0;i<n;i++)
58         cin>>a[i];
59     Merge_sort(a,n);
60     for(int i=0;i<n;i++)
61         cout<<a[i]<<" ";
62     return 0;
63 }

 

posted @ 2019-05-09 19:36  zuiaimiusi  阅读(149)  评论(0编辑  收藏  举报