zoukankan      html  css  js  c++  java
  • 归并排序的递归和迭代写法

     1 #include<iostream>
     2 using namespace std;
     3 int n;
     4 void print(int *a)
     5 {
     6     for(int i=0;i<n;i++)
     7     {
     8         cout<<a[i]<<" ";
     9     }
    10     cout<<endl;
    11 } 
    12 void merge(int *a,int *t,int begin,int mid,int end)
    13 {
    14     int xb=begin;
    15     int b=begin;
    16     int e=mid+1;
    17     while(b<=mid&&e<=end)
    18     {
    19         if(a[b]<=a[e])
    20         {
    21             t[xb++]=a[b++];
    22         }
    23         else
    24         {
    25             t[xb++]=a[e++];
    26         }
    27     }/* 总有一边先录完,剩下一边还有,所以还要继续录入*/
    28     while(b<=mid)
    29     {
    30         t[xb++]=a[b++];
    31     } 
    32     while(e<=end)
    33     {
    34         t[xb++]=a[e++];
    35     }
    36     /* 最后一步*/
    37     for(int i=begin;i<=end;i++)
    38     {
    39         a[i]=t[i];
    40     } 
    41 }
    42 void msort(int *a,int *t,int begin,int end)
    43 {
    44     if(begin>=end)
    45     {
    46         return;/* 不符合规范,无法排序*/
    47     }
    48     else
    49     {
    50         int mid=(begin+end)/2;/* 用mid把待排序数组分为两部分*/
    51         msort(a,t,begin,mid);
    52         msort(a,t,mid+1,end);
    53         merge(a,t,begin,mid,end);/* 排好序后合并即可*/ 
    54     } 
    55 } 
    56 void mergeSort(int *a)/* 封装一下*/
    57 {
    58     int *t;
    59     t=new int[n];
    60     msort(a,t,0,n-1);
    61     free(t);
    62 }
    63 int main()
    64 {
    65     cout<<"下面请输入问题规模n\n";
    66     cin>>n;
    67     int *a;
    68     a=new int[n];
    69     cout<<"下面请输入n个数字\n"; 
    70     for(int i=0;i<n;i++)
    71     {
    72         cin>>a[i];
    73     }
    74     mergeSort(a);
    75     cout<<"下面是排序后的结果\n"; 
    76     print(a);
    77 }
    78 /*
    79 16
    80 11 33 0 -5 -4 3 45 222 111 -789 516 2 6 8 7 84
    81 */

    递归写法很容易嘛,有思路就好写,先把满足长度的数组序列分成两部分,两部分再一直递归调用即可,两部分都调用结束后,最后在合并就好了,合并用的merge函数,可以结合代码和注释仔细看看。

     1 #include<iostream>
     2 using namespace std;
     3 int n;
     4 void print(int *a)
     5 {
     6     for(int i=0;i<n;i++)
     7     {
     8         cout<<a[i]<<" ";
     9     }
    10     cout<<endl;
    11 } 
    12 void merge(int *a,int *t,int begin,int mid,int end)
    13 {
    14     int xb=begin;
    15     int b=begin;
    16     int e=mid+1;
    17     while(b<=mid&&e<=end)
    18     {
    19         if(a[b]<=a[e])
    20         {
    21             t[xb++]=a[b++];
    22         }
    23         else
    24         {
    25             t[xb++]=a[e++];
    26         }
    27     }/* 总有一边先录完,剩下一边还有,所以还要继续录入*/
    28     while(b<=mid)
    29     {
    30         t[xb++]=a[b++];
    31     } 
    32     while(e<=end)
    33     {
    34         t[xb++]=a[e++];
    35     }
    36     /* 最后一步*/
    37     for(int i=begin;i<=end;i++)
    38     {
    39         a[i]=t[i];
    40     } 
    41 }
    42 void msort(int *a,int *t)
    43 {
    44     int s=1;
    45     int times=1;
    46     int i;
    47     while(s<n)
    48     {
    49         i=0;
    50         for(i=0;i+2*s<n;i=i+2*s)/* 两层循环,每次对长度为2*s的序列排序,然后用merge录入原数组*/
    51         {
    52             int mid=(i+i+2*s-1)/2;
    53             merge(a,t,i,mid,i+2*s-1);
    54         }
    55         int mid=(i+n-1)/2;
    56         merge(a,t,i,mid,n-1);
    57         s*=2;
    58         times++;
    59     }
    60     merge(a,t,0,s/2-1,n-1);
    61 }
    62 void mergeSort(int *a)
    63 {
    64     int *t;
    65     t=new int[n];
    66     msort(a,t);
    67     free(t);
    68 }
    69 int main()
    70 {
    71     cout<<"下面请输入问题规模n\n";
    72     cin>>n;
    73     int *a;
    74     a=new int[n];
    75     cout<<"下面请输入n个数字\n"; 
    76     for(int i=0;i<n;i++)
    77     {
    78         cin>>a[i];
    79     }
    80     mergeSort(a);
    81     cout<<"下面是排序后的结果\n"; 
    82     print(a); 
    83 }
    84 /*
    85 19
    86 11 33 0 -5 -4 3 45 222 111 -789 516 2 6 8 7 84 -28 -45 -456
    87 */

    这里是迭代写法,因为是迭代,所以用了两层循环,循环里面先使相邻2个有序,再使相邻4个有序。。。直到小于等于n的2的最大幂。考虑到n不一定正好是2的幂是,所以2层循环结束,最后再merge一次。

  • 相关阅读:
    K8S学习笔记之k8s使用ceph实现动态持久化存储
    Linux学习笔记之Centos7 自定义systemctl服务脚本
    ELK学习笔记之Kibana权限控制和集群监控
    ELK学习笔记之ELK6.0 X-pack设置用户名和密码
    Linux学习笔记之rsync配置
    K8S学习笔记之Pod的Volume emptyDir和hostPath
    不小心删除了某个包的一部分,重新安装方法
    串口数据解析总结
    CMakeLists 链接库相关指令
    google 开源项目阅读计划
  • 原文地址:https://www.cnblogs.com/dayq/p/12066154.html
Copyright © 2011-2022 走看看