【AcWing】1.1.2归并排序

一、归并排序

1、归并排序

  • 题目链接AcWing.787
    【AcWing】1.1.2归并排序_第1张图片
    这道题主要考察归并排序,废话不多说,上板子!
#include
#include
using namespace std;
const int N  = 1e6+5;
int a[N],temp[N];
void merge_sort(int q[],int l,int r)
{
    if(l>=r) return ;
    //确定中点
    int mid = l+r >> 1 ;
    //递归归并左边和右边
    merge_sort(q,l,mid);
    merge_sort(q,mid+1,r);
    //i 左边起点,j右边起点
    int k =0,i=l,j=mid+1;
    
    while(i<=mid&&j<=r)
    {
        if(q[i]<=q[j]) temp[k++] = q[i++];
        else
            temp[k++] = q[j++];
    }
    //若左边还有剩余数据则加入temp
    while(i<=mid)
        temp[k++] = q[i++];
    //若右边还有剩余数据则加入temp
    while(j<=r)
        temp[k++] = q[j++];
    for(i = l,j=0;i<=r;i++,j++)
        q[i] = temp[j];
}

int main()
{
    int k;
    cin>>k;
    for(int i =0;i<k;++i)
        cin>>a[i];
    merge_sort(a,0,k-1);
    for(int i =0;i<k;++i)
        cout<<a[i]<<' ';
    //system("pause");
    return 0;
}

2、逆序对的数量

  • AcWing.788
    【AcWing】1.1.2归并排序_第2张图片
     可以使用冒泡排序,归并排序求解逆序数的数量,显然,相比于冒泡排序的,归并排序在时间效率上更优秀。在归并排序中,存在天然的比较逆序数的操作,就是在两个归并段在排序过程中,会将两个归并段中较小的元素存放在临时数组中,我们只需要统计前面的归并段元素比后面归并段元素大的数量并累计求和即可。而且在归并过程中,数组逐渐趋于有序,要用中间的元素下标减去前面较大元素的下边并加一。
#include
#include
using namespace std;
const int N  = 1e6+5;
int a[N],temp[N];
unsigned int cnt = 0;
void merge_sort(int q[],int l,int r)
{
    if(l>=r) return ;
    //确定中点
    int mid = l+r >> 1 ;
    //递归归并左边和右边
    merge_sort(q,l,mid);
    merge_sort(q,mid+1,r);
    //i 左边起点,j右边起点
    int k =0,i=l,j=mid+1;
    
    while(i<=mid&&j<=r)
    {
        if(q[i]<=q[j]) temp[k++] = q[i++];
        else{
            temp[k++] = q[j++];
            ///求和(记得要加1)//
            cnt+=(mid-i+1);
        }
    }
    //若左边还有剩余数据则加入temp
    while(i<=mid)
        temp[k++] = q[i++];
    //若右边还有剩余数据则加入temp
    while(j<=r)
        temp[k++] = q[j++];
    for(i = l,j=0;i<=r;i++,j++)
        q[i] = temp[j];
}

int main()
{
    int k;
    cin>>k;
    for(int i =0;i<k;++i)
        cin>>a[i];
    merge_sort(a,0,k-1);
    cout<<cnt<<endl;
    system("pause");
    return 0;
}


你可能感兴趣的:(算法,排序算法,算法,数据结构)