码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序应用-------小和问题

时间:2018-01-13 15:38:23      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:问题   its   int   using   ==   逆序对   gpo   sort   log   

1、小和问题:类似月逆序对问题,是求给定序列中每个数前面比其小的数,然后累加,求出总和sum 

2、代码

(1)暴力求解,时间复杂度O(n^2)

//小和问题O(n^2)
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n, i , j;
    int a[100];
    while(~scanf("%d",&n))
    {
        for(i = 0; i < n; i++)
            scanf("%d",&a[i]);
        int res = 0;
        for(i = 1; i < n; i++)
        {
            for(int j = 0; j < i; j++)
                if(a[j] < a[i])
                    res += a[j];
        }
        printf("%d\n",res);
    }
}
/*
5
3 5 1 4 6
*/

(2)归并排序求解,时间复杂度O(nlogn)

//Mergesort 应用 小和问题O(nlogn)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100;
int temp[maxn];
int Merge(int a[], int l, int mid, int r)
{
    int i = l,j = mid + 1,k = 0;
    int res = 0;
    while(i <= mid && j <= r)
    {
        if(a[i] < a[j])
        {
            res += (r - j + 1) * a[i];
            temp[k++] = a[i++];
        }
        else
        {
            temp[k++] = a[j++];
        }
    }

    while(i <= mid)
    {
        temp[k++] = a[i++];
    }
    while(j <= r)
    {
        temp[k++] = a[j++];
    }

    for(int i = l, k = 0; i <= r; i++,k++)
        a[i] = temp[k];

    return res;
}

int MergeSort(int a[], int l, int r)
{
    if(l == r)
        return 0;
    int mid = l + ((r-l)>>1);
    return MergeSort(a,l,mid) + MergeSort(a,mid+1,r) + Merge(a,l,mid,r);
}

int main()
{
    int n;
    int a[maxn];
    while(~scanf("%d",&n))
    {
        for(int i = 0; i < n; i++)
            scanf("%d",&a[i]);
        int smallsum = MergeSort(a,0,n-1);
        printf("%d\n",smallsum);
    }

    return 0;
}
/*
5
3 5 1 4 6
*/

 

归并排序应用-------小和问题

标签:问题   its   int   using   ==   逆序对   gpo   sort   log   

原文地址:https://www.cnblogs.com/hhkobeww/p/8278918.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!