数据排序

桶排序

void In_Solve()
{
    scanf("%d",&n);
    FORa(i,1,n) scanf("%d",&a),b[a]++; //浪费空间比较大,多一个数组的花费
    FORa(i,1,N) while(b[i]--) printf("%d ",i);
}

选择排序

void Solve()
{
    FORa(i,1,n)
        FORa(j,i+1,n)
            if(a[i]>a[j])//从第一个开始,依次与后面的开始比较,不符合就换,直到比到第N个
                swap(a[i],a[j]);
    FORa(i,1,n) printf("%d ",a[i]);
}

冒泡排序

void Solve()
{
    FORa(i,2,n)
        FORa(j,i,n)
            if(a[j-1]>a[j])//从第一个开始,邻接两个开始比较,不符合就换,直到比到第N个
swap(a[j-1],a[j]); FORa(i,1,n) printf("%d ",a[i]); }

插入排序

oid Solve()
{
    int fa;
    scanf("%d",&n); 
    FORa(i,1,n)
    {
        scanf("%d",&fa);
        bool f=1;
        FORa(j,1,i-1)
        {
            if(fa<=a[j]) //找到适合的位置
            {
                FORs(k,i,j) a[k+1]=a[k];//将不符合的往后都挪一个,腾出一个空间,注意:需要从后往前处理,不然数据可能会错误刷新
                a[j]=fa,f=0;//插入,记得标记
                break;//尽可能降低时间复杂度
            }
        }    
        if(f) a[i]=fa;//没有插入队伍中,则直接跟上队尾
    }
    FORa(i,1,n) printf("%d ",a[i]);
}

快速排序

void sort(int l,int r) 
{
    int i=l,j=r,mid=a[(l+r)/2];//确定基准数
    do{
        while(a[i]<mid) i++;//从左往右找到一个大于基准数的的
        while(a[j]>mid) j--;//从右往左找到一个小于基准数的
        if(i<=j) swap(a[i],a[j]),i++,j--;//如果符合定位(基准数)的要求,则交换两者
    }while(i<=j);//符合定位循环
    if(l<j) sort(l,j);//处理左区间
    if(i<r) sort(i,r);//处理右区间
}

归并排序

void sort(int l,int r) 
{
    if(l==r) return;//一定要记得写,分治的bottom
    int mid=(l+r)/2,i=l,j=mid+1,k=l;
    sort(l,mid),sort(mid+1,r);//处理左右两个区间,使其有序
    while(i<=mid&&j<=r)
    {
        if(a[i]<=a[j]) b[k++]=a[i++];
        else b[k++]=a[j++],ans+=mid-i+1;
    }
    while(i<=mid) b[k++]=a[i++];//处理剩余的部分
    while(j<=r) b[k++]=a[j++];//将a中l-r这段区域进行排序结果储存在b数组中
    FORa(i,l,r) a[i]=b[i];//将b的结果反馈给a
}
原文地址:https://www.cnblogs.com/SeanOcean/p/10899232.html