合并排序以解决任务

时间:2014-08-27 07:36:25

标签: java sorting

我的ArrayList大小为10 ^ 5。我想计算行Pi和Pj中的数字对,其中Pi在行中位于Pj之前,Pi的值大于Pj。

CODE

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++;
            }
}

示例: 阵列:1,2,4,7,5,3答案:4
(4和3),(7和5),(7和3),(5和3)。
我使用合并排序,但我没有得到正确的答案 请解释我做错了什么。

1 个答案:

答案 0 :(得分:2)

快速查看代码,我认为这些行会导致错误的结果:

if (temp!=l)
    answer+=r+1;`

我不知道这是为了什么。如果你删除它,你将得到正确的结果。

但是,我认为合并排序不适合解决这个问题。看看这个例子:

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

5 4 | 3 4结果0

5 | 4 | 3 | 4结果0

4 5 | 3 4结果1

3 || 4 5 | 4结果2

3 4 || 5 | 4结果2

3 4 4 || 5 |结果3

3 4 4 5 || |结果3

现在,如果你考虑这个问题,合并排序确实具有n*log n的复杂性,所以我们不会查看所有对。