我的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)。
我使用合并排序,但我没有得到正确的答案
请解释我做错了什么。
答案 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
的复杂性,所以我们不会查看所有对。