【排序】归并排序

今天,学习一下归并排序

归并排序

      

首先,在网上找到了一个形象的图。

如图所示,归并排序就是把一堆数拆开拆开再拆开,然后把它合并合并再合并。这就用到了二分法。

拆开这一组数可能不难,但是把它们合并起来的时候就需要用到下面这个方法:

就以图中的两组数:0 4 5 8 和 1 3 7 9来举例

首先需要两个指针i和j,以及一个存放排好序的数列的数组result[]指向每列数的第一个,也就是i->0,j->1,比较它们的大小,因为0<1,所以result[0]=0,之后把i向后挪一位,就指向了4,比较4和1的大小,result[1]=1,再把j向后移……

以此类推,我们就会得到正确的数列了

OK!代码如下:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int data[1000],result[1000];
 5 void merge_add(int l,int r)
 6 {
 7     int mid=(l+r)>>1;
 8     int left_start=l;
 9     int left_end=mid;
10     int right_start=mid+1;
11     int right_end=r;
12     int result_start=l;
13     while(left_start<=left_end&&right_start<=right_end)
14     {
15         if(data[left_start]<data[right_start])
16         result[result_start++]=data[left_start++];
17         else result[result_start++]=data[right_start++];
18     }
19     while(left_start<=left_end)
20     result[result_start++]=data[left_start++];
21     while(right_start<=right_end)
22     result[result_start++]=data[right_start++];
23 }
24 void merge(int l,int r)
25 {
26     if(l==r) return;
27     if(r-l==1)
28     {
29         if(data[l]>data[r])
30         swap(data[l],data[r]);
31         return;
32     }
33     int mid=(l+r)>>1;
34     merge(l,mid);
35     merge(mid+1,r);
36     merge_add(l,r);
37     for(int i=l;i<=r;i++)
38     data[i]=result[i];
39 }
40 int main()
41 {
42     int n;
43     cin>>n;
44     for(int i=1;i<=n;i++)
45     cin>>data[i];
46     merge(1,n);
47     for(int i=1;i<=n;i++)
48     cout<<data[i]<<" ";
49     return 0; 
50 }

 

posted @ 2019-03-21 17:33  Exusiaii  阅读(120)  评论(0编辑  收藏  举报