Java 用于解决任务的合并排序

Java 用于解决任务的合并排序,java,sorting,Java,Sorting,我有一个ArrayList,大小为10^5。我想数一数这行中的数对,Pi和Pj,其中Pi在这行中领先于Pj,Pi的值比Pj大 代码 public void sort(ArrayList<Integer> finalarray, int size) { if(finalarray.size()<2) return ; ArrayList<Integer> right = new ArrayList

我有一个
ArrayList
,大小为10^5。我想数一数这行中的数对,Pi和Pj,其中Pi在这行中领先于Pj,Pi的值比Pj大

代码

public void sort(ArrayList<Integer> finalarray, int size)
        {   
            if(finalarray.size()<2) return ;

            ArrayList<Integer> right = new ArrayList<>();
            ArrayList<Integer> left = new ArrayList<>();
            int  mid = finalarray.size()/2;
            for(int i=0;i<mid;i++) left.add(finalarray.get(i));
            for(int j=mid;j<size;j++) right.add(finalarray.get(j));

            sort(left, left.size());
            sort(right, right.size());

            int l=0, r=0 , m =0;
            int temp=-1;
            while(l< left.size() && r< right.size())
            {
                  if(left.get(l)> right.get(r))
                  {
                      finalarray.set(m, right.get(r));
                     if(temp!=l)
                      answer+=r+1;
                     if( temp==l)
                         answer++;
                      r++;

                      temp=l;
                  }
                  else
                  {
                     finalarray.set(m, left.get(l));
                      l++;
                  }
                  m++;
            }
            while(l< left.size())
            {
                finalarray.set(m, left.get(l));
                 l++;
                 m++;
                 answer+=right.size();
            }
            while(r< right.size())
            {   
                finalarray.set(m, right.get(r));
                 r++;
                 m++;
            }
}
public void排序(ArrayList finalarray,int size)
{   

如果(finalarray.size()快速查看一下您的代码,我认为这些行会给出错误的结果:

if (temp!=l)
    answer+=r+1;`
我不明白这是为什么。如果你删除它,你会得到正确的结果

但是,我认为合并排序不适合解决此问题。请看以下示例:

对于列表
5 4 3 4
来说,正确答案应该是4。现在让我们看看,考虑到您的方法,合并排序会对该列表做什么:

54 | 34
结果0

5 | 4 | 3 | 4
结果0

45 | 34
结果1

3 | | 4 5 | 4
结果2

34 | | 5 | 4
结果2

3 4 | | 5 |
3结果

3 4 4 5 | | |
结果3


现在如果你想一想,合并排序的复杂性确实是
n*log n
,所以我们不看所有的对。

答案怎么不正确?但是我没有得到正确的答案你得到了什么答案?如果你需要帮助,你必须提供更多的细节。我得到的答案是7