1. 程式人生 > >歸並排序應用-------小和問題

歸並排序應用-------小和問題

merge gpo 逆序對 sort %d 個數 div print return

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 */

歸並排序應用-------小和問題