• 内部排序—— 第5波 ——————【归并排序】


    归并排序是一种利用分治思想的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序还是一种稳定的排序方法。所需空间复杂度为O(n)。时间复杂度为O(nlogn)。

    //归并排序
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    const int maxn = 1e3+200;
    void Merge(int sorce[],int tmp[],int s,int m,int t){
        int i, j, k;
        //i为第一部分的指针、j为第二部分的指针、k为辅助数组的指针
        for(i = s, j = m+1, k = s; i <= m&&j <= t; k++){
            if(sorce[i] < sorce[j]){
                tmp[k] = sorce[i++];
            }else{
                tmp[k] = sorce[j++];
            }
        }
        if(i <= m){ //第二部分全部写入辅助数组,第一部分有剩余
            for(; i <= m; i++){
                tmp[k] = sorce[i]; k++;
            }
        }
        if(j <= t){ //第一部分全部写入辅助数组,第二部分有剩余
            for(; j <= t; j++){
                tmp[k] = sorce[j]; k++;
            }
        }
        for(i = s; i <= t; i++){    //写回原数组
            sorce[i] = tmp[i];
        }
    }
    void MergeSort(int sorce[],int tmp[],int s,int t){
        if(s == t){
            tmp[s] = sorce[s];
        }else{
            int m = (s+t)/2;
            MergeSort(sorce,tmp,s,m);   //将sorce[s...m]有序地归并到tmp[s...m]中
            MergeSort(sorce,tmp,m+1,t); //将sorce[m+1...t]有序地归并到tmp[m+1...t]中
            Merge(sorce,tmp,s,m,t); //将tmp[s...m]和tmp[m+1...t]归并到sorce[s...t]中
        }
    }
    int main(){
        int a[maxn],b[maxn];
        int n;
        while(scanf("%d",&n)!=EOF){
            for(int i = 1; i <= n; i++){
                scanf("%d",&a[i]);
            }
            MergeSort(a,b,1,n);
            for(int i = 1; i <= n; i++){
                printf("%d ",b[i]);
            }
        }
        return 0;
    }
    

      

    归并排序求逆序数:

    //求逆序数
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    typedef long long LL;
    const int maxn = 1e6+300;
    int a[maxn], b[maxn];
    LL Merge(int L,int M,int R){
        LL ret = 0;
        int i, j, k = L;
        for(i = L, j = M+1; i<=M&&j<=R; k++){
            if(a[i] > a[j]){
                ret += (M-i+1);
                b[k] = a[j]; j++;
            }else{
                b[k] = a[i]; i++;
            }
        }
        if(i <= M){
            for( ; i <= M; i++){
                b[k] = a[i]; k++;
            }
        }
        if(j <= R){
            for( ; j <= R; j++){
                b[k] = a[j]; k++;
            }
        }
        for(i = L; i <= R; i++){
            a[i] = b[i];
        }
        return ret;
    }
    LL Merge_sort(int L,int R){
        LL ret = 0;
        if(L == R) return ret;
        int mid = (L+R)/2;
        ret += Merge_sort(L,mid);
        ret += Merge_sort(mid+1,R);
        ret += Merge(L,mid,R);
        return ret;
    }
    
    int main(){
        int cas, n;
        scanf("%d",&cas);
        while(cas--){
            scanf("%d",&n);
            for(int i = 1; i <= n; i++){
                scanf("%d",&a[i]);
            }
            LL res = Merge_sort(1,n);
            printf("%lld
    ",res);
        }
        return 0;
    }
    

      

  • 相关阅读:
    xgzc— math 专题训练(一)
    floyd判圈算法
    CF961G Partitions
    luoguP4778 Counting swaps
    AT3913 XOR Tree(巧妙转换+状压dp)
    手动实现aop编程
    代理模式
    spring重点一:处理对象创建时间 个数以及方式
    spring helloword
    spring用来干什么,解决的问题
  • 原文地址:https://www.cnblogs.com/chengsheng/p/5364625.html
Copyright © 2020-2023  润新知