2018.5.17(归并排序)

归并排序

#include<iostream>
#include<cstdio>
using namespace std;

void Merge(int a[],int l,int mid,int r);

void MergeSort(int a[],int l,int r)
{

    if(l==r)
        return ;

    int mid=l+((r-l)>>1);

    MergeSort(a,l,mid);
    MergeSort(a,mid+1,r);

    Merge(a,l,mid,r);
}
void Merge(int a[],int l,int mid,int r)
{
    int i=0;
    int p1=l,p2=mid+1;
    int help[r-l+1];

    while(p1<=mid&&p2<=r)
        help[i++]=(a[p1]<a[p2])?a[p1++]:a[p2++];

    while(p1<=mid)
        help[i++]=a[p1++];
    while(p2<=r)
        help[i++]=a[p2++];

    for(int i=0;i<r-l+1;i++)
        a[l+i]=help[i];
}

int main()
{
    int a[100];
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
            cin>>a[i];

        MergeSort(a,0,n-1);

        for(int i=0;i<n;i++)
            cout<<a[i]<<' ';
        cout<<endl;
    }
    return 0;
}

小和问题

这里写图片描述

#include<iostream>
#include<cstdio>
using namespace std;

int Merge(int a[],int l,int mid,int r)
{
    int i=0;
    int help[r-l+1];
    int p1=l,p2=mid+1;
    int ans=0;

    while(p1<=mid&&p2<=r)
    {
        ans+=(a[p1]<a[p2])?(r-p2+1)*a[p1]:0;
        help[i++]=(a[p1]<a[p2])?a[p1++]:a[p2++];
    }

    while(p1<=mid)
        help[i++]=a[p1++];

    while(p2<=r)
        help[i++]=a[p2++];

    for(int i=0;i<r-l+1;i++)
        a[l+i]=help[i];

    return ans;
}

int MergeSort(int a[],int l,int r)
{
    if(l==r)
        return 0;

    int mid=l+((r-l)>>1);//相当于(r+l)/2,防止(r+l)越界

    return MergeSort(a,l,mid)+MergeSort(a,mid+1,r)+Merge(a,l,mid,r);
}

int main()
{
    int a[100];
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
            cin>>a[i];

        int ans=MergeSort(a,0,n-1);

        cout<<ans<<endl;
    }
    return 0;
}

这里写图片描述

#include<iostream>
#include<cstdio>
using namespace std;

void Merge(int a[],int L,int Mid,int R)
{
    int index=0;
    int help[R-L+1];
    int p1=L,p2=Mid+1;

    while(p1<=Mid&&p2<=R)
    {
        if(a[p1]<a[p2])
            for(int i=p2;i<=R;i++)
                printf("(%d,%d)\n",a[p1],a[i]);

        help[index++]=(a[p1]<a[p2])?a[p1++]:a[p2++];
    }

    while(p1<=Mid)
        help[index++]=a[p1++];

    while(p2<=R)
        help[index++]=a[p2++];

    for(int i=0;i<R-L+1;i++)
        a[L+i]=help[i];
}

void MergeSort(int a[],int L,int R)
{
    if(L>=R)
        return;

    int mid=L+((R-L)>>1);

    MergeSort(a,L,mid);
    MergeSort(a,mid+1,R);

    Merge(a,L,mid,R);
}

int main()
{
    int a[100];
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
            cin>>a[i];

        MergeSort(a,0,n-1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/violet_ljp/article/details/80357416