ACM 基本排序算法,归并排序(求逆序对)

1.归并排序

主要运用到的的思想:分治、递归

功能:1.数组进行排序。
   2.计算数组中的逆序对的个数。

时间复杂度:稳定的O(nlogn)
空间复杂度:O(n)

附上模板代码:

#include<bits/stdc++.h>
using namespace std;
long long Merge(int a[],int b[],int s,int m,int e){
    int i=s,j=m+1,k=s;
    long long ans=0;
    while(i<=m && j<=e)
    {
        if(a[i]<=a[j])
            b[k++]=a[i++];
        else
            {b[k++]=a[j++];
            //求逆序对
            ans+=mid-i+1;}
    }
    while(i<=m)
        b[k++]=a[i++];
    while(j<=e)
        b[k++]=a[j++];
    for(int n=s;n<=e;n++)
        a[n]=b[n];
    return ans;
}
void mergesort(int a[],int b[],int s,int e){
    long long ans=0;
    if(s<e){
        int m=(s+e)/2;
        mergesort(a,b,s,m);
        mergesort(a,b,m+1,e);
        ans+=Merge(a,b,s,m,e);
    }
}
int a[100005];
int b[100005];
int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    mergesort(a,b,1,n);
    for(int i=1;i<=n;i++)
    {
        cout<<a[i]<<" ";
    }
    return 0;
}

2.冒泡排序

主要思想:不断交换相邻两个逆序的元素。最终将最大排在最后,类似于可乐冒泡。

时间复杂度:O(n²)
空间复杂度:O(n)

#include<bits/stdc++.h>
using namespace std;
void bubbleSort(int a[],int n){
    for(int i=1;i<n;i++){//n-1趟
        for(int j=1;j<n-i+1;j++){//除去已经排好的i个,所以是枚举n-i+1个
            if(a[j+1]<a[j]){
                int t=a[j+1];
                a[j+1]=a[j];
                a[j]=t;
            }
        }
    }
}
int a[100005];
int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    bubbleSort(a,n);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

3.选择排序

主要思想:通过与n次(n为数组的长度)的选择,可以将每次当前为选择的最大(最小)的元素放在相应位置上。
时间复杂度:O(n²)
空间复杂度:O(n)

#include<bits/stdc++.h>
using namespace std;
void selectSort(int a[],int n){
    for(int i=1;i<=n;i++){
        int Min=i;
        for(int j=i+1;j<=n;j++){
            if(a[j]<a[Min]){
                Min=j;
            }
        }
        int t=a[Min];
        a[Min]=a[i];
        a[i]=t;
    }
    return ;
}
int a[100005];
int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    selectSort(a,n);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}


©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页