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