快速排序 与 归并排序

  1. 快速排序

  • 步骤
  • 1、确定分界点 x=q[(L+R)>>1]
    2、调整区间 把区间划分为两个部分,左边的数<=x,右边的数>=x(最重要的)
    3、递归处理左右两部分 
  • 时间复杂度
  • 代码
    #include<iostream>
    using namespace std;
    
    const int N = 1e5+10;
    int q[N];
    //快排模板
    void quick_sort(int q[],int L,int R)
    {
        if(L>=R) return;
        
        int i=L-1,j=R+1,x=q[L+R>>1];
        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),quick_sort(q,j+1,R);
    }
    int main()
    {
        int n; cin >> n;
        
        for(int i=0;i<n;i++) scanf("%d",&q[i]);
        
        quick_sort(q,0,n-1);
        
        for(int i=0;i<n;i++) printf("%d ",q[i]);
        
        return 0;
    }

    归并排序

  • 思想方法基于分治
    1、确定分界点 mid = L+R >> 1
    2、递归排序左右两边
    3、归并 合二为一(双指针算法)每次取得左右两个序列的最小值
  • 稳定算法:原序列中数值相同排完序之后相对顺序是不变
  • 时间复杂度 O(nlogn)
  • 代码
    #include<iostream>
    using namespace std;
    
    const int N = 1e5+10;
    int q[N],tem[N];
    
    void merge_sort(int q[],int L,int R)
    {
        if(L>=R) return;//当只有一个或者没有
        //(一)确定分界点
        int mid=L+R>>1;
        //(二)递归处理左右两个部分
        merge_sort(q,L,mid),merge_sort(q,mid+1,R);
        
        //(三)归并
        int k=0,i=L,j=mid+1;
            //3.1去两者中的较小者拿出来
        while(i<=mid && j<=R)
        {
            if(q[i]<=q[j]) tem[k++]=q[i++];
            else tem[k++]=q[j++];
        }
            //3.2当其中一方还没有比完,直接将后面的拿过来
        while(i<=mid) tem[k++]=q[i++];
        while(j<=R) tem[k++]=q[j++];
        
        for(i=L,j=0;i<=R;i++,j++) q[i]=tem[j];
        
    }
    int main()
    {
        int n; cin >> 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;
    }

    //截止2020-2.6-22:08 重点掌握的就是快速排序与归并排序的代码思想步骤,这个在笔试的时候几乎不会用到,但是最后面试的时候听说会考到!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值