• 【算法】快速排序与归并排序


    一,快速排序

    1.1模板

    void quick_sort(int q[], int l, int r) {
        if (l >= r)
            return;
        int x = q[l], i = l - 1, j = 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]);
            else
                break;
        }
        quick_sort(q, l, j);
        quick_sort(q, j + 1, r);
        //如果这里是i的话那么填空i-1,i。x不能取q[l]和q[(l+r)>>1],否则会出现边界问题。
        //如果这里是j的话那么填空j,j+1。x不能取q[r]和q[(l+r+1)>>1],否则会出现边界问题。
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    1.2题目:第k个数

    给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。

    输入格式

    第一行包含两个整数 nk

    第二行包含 n 个整数(所有整数均在 1-10^9 范围内),表示整数数列。

    输出格式

    输出一个整数,表示数列的第 k 小数。

    数据范围

    1<=n<=100000

    1<=k<=n

    输入样例

    5 3
    2 4 1 5 3
    
    • 1
    • 2

    输出样例

    3
    
    • 1

    AC代码

    #include 
    
    using namespace std;
    
    int N[100010];
    
    void quick_sort(int q[],int l,int r){
        if(l>=r)return;
        int x=q[l],i=l-1,j=r+1;
        while(ix);
            if(i>1]
        //当这里为i的时候则填i-1和i。x则不能为q[l]和q[(r+l)>>1]
    }
    
    
    int main(){
        int n,k;
        cin>>n>>k;
        for(int i=0;i>N[i];
        quick_sort(N,0,n-1);
        cout<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    二,归并排序

    1.1模板

    int tmp[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;
        //归并的过程
        while(i<=mid&&j<=r)
            if(q[i]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    1.2题目:逆序对的数量

    给定一个长度为 n的整数数列,请你计算数列中的逆序对的数量。

    逆序对的定义如下:对于数列的第 i个和第 j 个元素,如果满足 ia[i]>a[j],则其为一个逆序对;否则不是。

    输入格式

    第一行包含整数 n,表示数列的长度。

    第二行包含 n 个整数,表示整个数列。

    输出格式

    输出一个整数,表示逆序对的个数。

    数据范围

    1<=n<=100000,

    数列中的元素的取值范围[1,10^9]。

    输入样例

    6
    2 3 4 5 6 1
    
    • 1
    • 2

    输出样例

    5
    
    • 1

    AC代码

    #include 
    
    using namespace std;
    
    int q[100010],tmp[100010];
    typedef long long LL;
    
    LL merge_sort(int l,int r){
        if(l>=r)return 0;
        int mid=l+r>>1;
        LL res=merge_sort(l,mid)+merge_sort(mid+1,r);
        int i=l,j=mid+1,k=0;
        while(i<=mid&&j<=r){
            if(q[i]<=q[j])tmp[k++]=q[i++];
            else{
             tmp[k++]=q[j++];
             res+=mid-i+1;
            }
        }
        while(i<=mid)tmp[k++]=q[i++];
        while(j<=r)tmp[k++]=q[j++];
        for(i=l,j=0;i<=r;i++,j++)q[i]=tmp[j];
        return res;
    }
    
    int main(){
        int n;
        cin>>n;
        for(int i=0;i>q[i];
        cout<
  • 相关阅读:
    递归函数:输出正整数N各个位上的数字
    解决:在单项目组件里面引入 base.scss/ base.less 等的外部文件不成功的问题
    LDGRB-01 用于在边缘处理人工智能的嵌入式硬件
    国庆中秋特辑(二)浪漫祝福方式 使用生成对抗网络(GAN)生成具有节日氛围的画作
    Google Cloud Natural Language情感分析教程
    Linux—文件编程
    ReentrantLock 实现原理
    C++中TCP socket传输文件
    使用aliyun的registry上传下载镜像
    前端-(6)
  • 原文地址:https://blog.csdn.net/qq_39757593/article/details/127953775