1 solutions

  • 0
    @ 2024-12-10 23:39:22

    C :

    #include <stdio.h>
    #include <stdlib.h>
    
    int a[500001],t[500001];
    long long sum;
    
    void Merge(int l,int m,int r)
    {
    	int p=0;
    	int i=l,j=m+1;
    	while(i<=m&&j<=r)
    	{
    		if(a[i]>a[j])
    		{
    			t[p++]=a[j++];
    			sum+=m-i+1;
    		}
    		else
    			t[p++]=a[i++];
    	}
    	while(i<=m)
    		t[p++]=a[i++];
    	while(j<=r)
    		t[p++]=a[j++];
    	for(i=0;i<p;i++)
    		a[l+i]=t[i];
    }
    
    void MergeSort(int l,int r)
    {
    	int m;
    	if(l<r)
    	{
    		m=(l+r)/2;
    		MergeSort(l,m);
    		MergeSort(m+1,r);
    		Merge(l,m,r);
    	}
    }
    
    int main()
    {
    	int n,i;
    	while(scanf("%d",&n)!=EOF,n)
    	{
    		sum=0;
    		for(i=0;i<n;i++)
    			scanf("%d",&a[i]);
    		MergeSort(0,n-1);
    		printf("%lld\n",sum);
    	}
    	return 0;
    }
    

    C++ :

    #include <stdio.h>
    #include <stdlib.h>
    
    int a[500001],t[500001];
    long long sum;
    
    void Merge(int l,int m,int r)
    {
    	int p=0;
    	int i=l,j=m+1;
    	while(i<=m&&j<=r)
    	{
    		if(a[i]>a[j])
    		{
    			t[p++]=a[j++];
    			sum+=m-i+1;
    		}
    		else
    			t[p++]=a[i++];
    	}
    	while(i<=m)
    		t[p++]=a[i++];
    	while(j<=r)
    		t[p++]=a[j++];
    	for(i=0;i<p;i++)
    		a[l+i]=t[i];
    }
    
    void MergeSort(int l,int r)
    {
    	int m;
    	if(l<r)
    	{
    		m=(l+r)/2;
    		MergeSort(l,m);
    		MergeSort(m+1,r);
    		Merge(l,m,r);
    	}
    }
    
    int main()
    {
    	int n,i;
    	while(scanf("%d",&n)!=EOF,n)
    	{
    		sum=0;
    		for(i=0;i<n;i++)
    			scanf("%d",&a[i]);
    		MergeSort(0,n-1);
    		printf("%lld\n",sum);
    	}
    	return 0;
    }
    

    Java :

    /**
     * @(#)Main.java
     *
     *
     * @author 
     * @version 1.00 2013/11/28
     */
    import static java.lang.System.*;
    import java.util.Scanner;
    import java.util.ArrayList;
    import java.util.*;
    
    public class Main {
        static long count=0;//统计交换次数
        static int[] B = new int[500001];
        static int[] A = new int[500001];
        
        public static void main(String[] args) 
        {
            Scanner in=new Scanner(System.in);
            while(in.hasNextInt())
            {
                count=0;
                int n=in.nextInt();
                if(n==0) break;
                //int[] num = new int[n];
                //int[] num = A;
                for(int i=0;i<n;i++)
                    A[i]=in.nextInt();
                    
                guiBing(0, n-1);
                System.out.println(count);
            } 
        }
        
        public static void sort_method(int p, int q, int r) 
        {//把两个已经排好的子数组进行合并排序
            int A_length=r-p+1;
            //int[] B=new int[A.length];
            int i=p,j=q+1,k=0;
            while(i<=q&&j<=r) {
                if(A[i]>A[j]) {
                    B[k++]=A[j++];
                    count+=q-i+1;
                }
                else
                    B[k++]=A[i++];
                }
            while(i<=q)
                B[k++]=A[i++];
            while(j<=r)
                B[k++]=A[j++];
                 
            for(int h=0;h<k;h++)
                A[h+p]=B[h];
         }
            
         public static void guiBing(int p,int r) 
         {//递归划分数组为两个子数组
              if(p<r){
                  int q=(p+r)/2;
                  guiBing(p,q);
                  guiBing(q+1,r);
                  sort_method(p,q,r);
                }
            }
        }
    
    • 1

    Information

    ID
    623
    Time
    1000ms
    Memory
    32MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By