这题的题目挺难理解的,画的图让我想到冒泡排序,但是用冒泡肯定会超时的,后来经过高人指点才知道要用归并排序,但是知道了方法还是不会求逆序数,没办法,参考了网上大牛的解放之后自己写的代码如下: import java.util.Scanner; public class Main { //记录逆序数的个数 private static long sum=0; public static void mergeSort(long[] a,long[] temp,int left,int right){ if(left==right){ return; } if((right-left)==1){ if(a[left]>a[right]){ long b=a[left]; a[left]=a[right]; a[right]=b; sum++; } return; }else{ int mid=(left+right)/2; mergeSort(a,temp,left,mid); mergeSort(a,temp,mid+1,right); for(int i=left;i<=right;i++){ temp[i]=a[i]; } int i1=left; int i2=mid+1; for(int curr=left;curr<=right;curr++){ if(i1==mid+1){ a[curr]=temp[i2++]; }else{ if(i2>right){ a[curr]=temp[i1++]; } else{ if(temp[i1]<temp[i2]){ a[curr]=temp[i1++]; }else{ //mid右边的都是逆序的 sum+=mid-i1+1; a[curr]=temp[i2++]; } } } } } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub long[] a=new long[500000]; long[] temp=new long[500000]; Scanner reader=new Scanner(System.in); while(reader.hasNext()){ long numOfLine=reader.nextLong(); if(numOfLine!=0){ for(int i=0;i<numOfLine;i++){ a[i]=reader.nextLong(); // System.out.print(a[i]+" "); } // System.out.println(); mergeSort(a,temp,0,(int) (numOfLine-1)); // System.out.print("sorted:"); // for(int i=0;i<numOfLine;i++){ // // System.out.print(a[i]+" "); // // } // System.out.println(); System.out.println(sum); sum=0; }else{ break; } } } }