学习过程中的一个小实验(含快排与归并)

/*俺实在是太划水了 也太菜了 /哭           躺在床上挂机的同时 学了一哈这个 遂写了一篇完全没有水平的题解
          1<n<100000;
          整数最大为1e9;
                                              在这里要 %%%yxc大佬
  正在学习 水平有限  多多见谅!  */
  quick sort,merge sort 作者:yxc
  快排:链接:https://www.acwing.com/activity/content/code/content/39784/
  归并排序:链接:https://www.acwing.com/activity/content/code/content/39790/
  来源:AcWing

实验表明,cin cout速度明显不如scanf和printf,当数据规模较大时更加明显
同时也有:quick_sort≈sort(无cmp默认)≈merge_sort<sort(有cmp)<<各种cin,cout
当规模较小时,可以使用cin cout快速写出答案 节省解题时间 效率相差不大
当规模较大时 使用scnaf printf,可以节省很多的运行时间

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;//define N 1000010    //定义的固定的值(范围)
int q[N];//定义数组

void quick_sort(int q[], int l, int r){//快速排序 读入 数组,左端left,右端right
    if(l>=r) return ;//排除数组只有一个的情况
    int i=l-1, j=r+1, x=q[l+r >> 1];// 后面dowhile会先执行一次,所以这里 i=l-1,j=r+1,x是标准值,直接取了中间那个值(实际上可以随便取) l+r>>1 相当于 l+r/2 (位运算)
    while(i<j){
        do i++; while (q[i] < x);             //优美的指针一  向右移动一位 (满足小于标准值
        do j--; while(q[j] >x);               //优美的指针二 向左移动一位 (满足大于标准值
        if(i<j) swap(q[i],q[j]);              //当他们都卡住的时候 (都不满足条件,那么把他们对应的那一位数组的值交换一下) 指针交换一哈 然后下一轮继续执行 十分优美
    }
    quick_sort(q,l,j);                      //把q数组前面的部分排序(小于标准值的部分)
    quick_sort(q,j+1,r);                    //把q数组后面的部分排序(大于标准值的部分) 同时避免了边界问题
}  //最后的两个快排相当于做了递归实现  
void merge_sort(int a[],int l,int r){//归并排序
    if(l>=r) return ;//数组长度只有1的时候
    int mid = l+r>>1;//取中间

    merge_sort(q,l,mid);merge_sort(q,mid+1,r);//排呀我使劲地排 递归,左半边和右半边

    int k=0,i=l,j=mid+1;              //把值取好
    while(i<=mid&&j<=r)                //开始排,都在区间内
        if(q[i]<=q[j]) temp[k++]=q[i++]; //把小的存进去 temp是个临时存放的数组
        else temp[k++]=q[j++];           //同上
    while(i<=mid) temp[k++]=q[i++];      //把多的放进去  都是最大的
    while(j<=r)  temp[k++]=q[j++];       //把多的放进去 都是最大的

    for(int i=l,j=0;i<=r;i++,j++) q[i]=temp[j];    //这个时候temp已经排好了,只需要把temp放进a中就可以了
}                                                  //归并排序相当于一段一段变成一半来排,然后再组合在一起 一层一层往回走

int cmp(int &a,int &b){
    return a<b;//从小到大
}
/*
 * int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&q[i]);         //输入 scanf效率准确度较cin更高  当数据大的时候效率好很多
    }

    quick_sort(q,0,n-1);          //进行优美的  双指针排序

    for(int i=0;i<n;i++){
        printf("%d ",q[i]);        //同理  printf 比 cout 好一点
    }
    return 0;                      //这种情况 最快 为170ms  假如使用 cin cout的话 时间为 350ms 时间增加了一倍
}
*/

/*int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&q[i]);

    merge_sort(q,0,n-1);

    for(int i=0;i<n;i++) printf("%d ",q[i]);
    return 0;
}                   运行时间为170-180ms,使用cin cout的话 时间为380ms 时间加倍
*/

/*
 * int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&q[i]);
    }


    sort(q,q+n,cmp);               //没有cmp默认从小到大


    for(int i=0;i<n;i++){
        printf("%d",q[i]);
    }
    return 0;
}                               */  //这种情况耗时为221ms  假如使用cin cout的话 耗时为407ms 也几乎增加了一倍的时间

/*
 * int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&q[i]);
    }


    sort(q,q+n);               //没有cmp默认从小到大


    for(int i=0;i<n;i++){
        printf("%d",q[i]);
    }
    return 0;
}                                //这种情况耗时为178ms 假如使用cin cout的话 耗时为  380ms 时间也增加了一倍
*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值