归并排序学有所得

emmmmmm.......
写了好久好久终于写出来了归并排序,在写出来之前,对二分的理解只有理论上的,只有当把归并排序写出来时才能稍微理解到一些二分的应用,虽然归并排序的速度并没有快排来的快但是却能有效的帮助我了解二分。
//
归并排序的原理简单来说就是把一个无序的数组从中间砍开,分成两半,再把这两半延中间砍开,再分成两半,单分到只有一个元素时,那么这个数组就自然有序了,接着再按着顺序将其两两,连接在一起,知道恢复原来的长度。其实在刚开始我傻傻的认为要开动态数组?其实不然,只要巧妙的运用递归思想,就不用那么麻烦了;
接下来我们看代码::

#include<iostream>
using namespace std;
#define N 10000006
int a[N];
int b[N];
void gui(int l,int mid,int r){

    int p1=l,p2=mid+1;
    for(int i=l;i<=r;i++){
    if((a[p1]<=a[p2])||(p2>r)&&(p1<=mid)){
        b[i]=a[p1];
        p1++;
    }else{
        b[i]=a[p2];
        p2++;
    }
    }
for(int i=l;i<=r;i++){
    a[i]=b[i];
}
}
void erfen(int l,int r){//递归进行二分,直到单个元素,再回到原长。
    int mid=(l+r)>>1;
    if(l<r){
        erfen(l,mid);
        erfen(mid+1,r);
    }
    gui(l,mid,r);
}

int main(){
    int m;
    cin>>m;
    for(int i=1;i<=m;i++)cin>>a[i];
    erfen(1,m);
for(int i=1;i<=m;i++){
    cout<<a[i]<<" ";
}
    return 0;
}
全部评论

相关推荐

一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务