挑战程序设计竞赛(算法和数据结构)——7.6逆序数的JAVA实现

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——7.6逆序数的JAVA实现相关的知识,希望对你有一定的参考价值。

逆序数的题简单来说就可以归化成判断归并排序需要交换几次的问题,因此代码可以直接沿用归并排序。
思路讲解:

import java.io.BufferedInputStream;
import java.util.Scanner;

public class InversionNumber 
    public static void main(String[] args) 
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        int n = cin.nextInt();
        int[] S = new int[n];
        for (int i=0;i<n;i++)
            S[i] = cin.nextInt();
        
        int cnt = mergeSort(S, 0, n);
        System.out.println(cnt);
    

    public static int merge(int[] A, int left, int mid, int right)
        int n1 = mid - left;
        int n2 = right - mid;
        int cnt = 0;
        int [] L = new int[n1+1];
        int [] R = new int[n2+1];
        for(int i=0;i<n1;i++)
            L[i] = A[left+i];
        
        for(int j=0;j<n2;j++)
            R[j] = A[mid+j];
        
        L[n1] = Integer.MAX_VALUE;
        R[n2] = Integer.MAX_VALUE;
        int i = 0;
        int j = 0;
        for(int k = left;k<right;k++)
            if(L[i]<=R[j])
                A[k] = L[i];
                i++;
            
            else
                A[k] = R[j];
                j++;
                cnt+=n1-i;
            
        
        return cnt;
    

    public static int mergeSort(int[] A, int left, int right)
        if(left+1<right)
            int mid = (left+right)/2;
            int v1,v2,v3;
            v1 = mergeSort(A,left, mid);
            v2 = mergeSort(A,mid,right);
            v3 = merge(A, left, mid, right);
            return v1+v2+v3;
        
        else return 0;
    


输入:

5
3 5 2 1 4

输出:

6

以上是关于挑战程序设计竞赛(算法和数据结构)——7.6逆序数的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现

挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现

挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现