分治在排序算法中的应用

C++学习笔记(四)

Posted by Chen Jinhao on July 20, 2021

分治在排序算法中的应用

1.归并排序(分治&递归)
void Merge(int a[],int s,int m,int e,int tmp[])
{
    int pb=0;
    int p1=s,p2=m+1;
    while(p1<=m&&p2<=e)
    {
        if(a[p1]<a[p2])
        tmp[pb++]=a[p1++];
        else tmp[pb++]=a[p2++];
    }
    while(p1<=m)
        tmp[pb++]=a[p1++];
    while(p2<=e)
        tmp[pb++]=a[p2++];
    for(int i=0;i<e-s+1;i++)
        a[s+i]=tmp[i];
}
void MergeSort(int a[],int s,int e,int tmp[])
{
    if(s<e)
    {
        int middle=(e+s)/2;
        int tmp1[100],tmp2[100];
        MergeSort(a,s,middle,tmp);
        MergeSort(a,middle+1,e,tmp+middle-s);
        Merge(a,s,middle,e,tmp);
    }
}
2.快速排序(分治&递归)
void swap(int &a,int &b)
{
    int tmp=a;
    a=b;
    b=tmp;
}
void Quicksort(int a[],int s,int e)
{
    if(s>=e) return;
    int k=a[s];
    int i=s,j=e;
    while(i!=j)
    {
        while(j>i&&a[j]>=k) j--;
        swap(a[i],a[j]);
        while(j>i&&a[i]<=k) i++;
        swap(a[i],a[j]);
    }//处理完后,a[i]=k;
    Quicksort(a,s,i-1);
    Quicksort(a,i+1,e);
}