Java 阵列中的反转数
我试图找出任何数组中的反转数。我已经申请过了。当合并子数组时,如果右子数组的任何值小于左子数组的任何值,我会计算数字。如果数组包含大量数据,则此代码不起作用Java 阵列中的反转数,java,arrays,mergesort,inversion,Java,Arrays,Mergesort,Inversion,我试图找出任何数组中的反转数。我已经申请过了。当合并子数组时,如果右子数组的任何值小于左子数组的任何值,我会计算数字。如果数组包含大量数据,则此代码不起作用 private static long getNumberOfInversions(int[] a, int[] b, int left, int right) { long numberOfInversions = 0; if (right > left) {
private static long getNumberOfInversions(int[] a, int[] b, int left,
int right)
{
long numberOfInversions = 0;
if (right > left)
{
int ave = (left + right) / 2;
numberOfInversions = getNumberOfInversions(a, b, left, ave);
numberOfInversions += getNumberOfInversions(a, b, ave + 1, right);
numberOfInversions += merge(a, b, left, ave + 1, right);
}
return numberOfInversions;
}
public static long merge(int[] a, int b[], int left, int ave, int rigth)
{
int i = 0, j = left, k = ave;
long count = 0;
while (j <= ave - 1 && k <= rigth)
{
if (a[j] <= a[k])
{
b[i] = a[j];
i++;
j++;
}
else
{
b[i] = a[k];
count += ave - j;
i++;
k++;
}
}
while (j <= ave - 1)
{
b[i] = a[j];
i++;
j++;
}
while (k <= rigth)
{
b[i] = a[k];
i++;
k++;
}
while (left <= rigth)
{
a[left] = b[i];
left++;
i++;
}
return count;
}
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++)
{
a[i] = scanner.nextInt();
}
int[] b = new int[n];
System.out.println(getNumberOfInversions(a, b, 0, n - 1));
}
private static long getNumberOfInversions(int[]a,int[]b,int left,
整数(右)
{
长倒数=0;
如果(右>左)
{
int ave=(左+右)/2;
numberOfInversions=获取numberOfInversions(a、b、左、ave);
numberOfInversions+=获取numberOfInversions(a、b、ave+1,右);
numberOfInversions+=合并(a、b、左、ave+1、右);
}
返回倒数;
}
公共静态长合并(int[]a,int[]b,int-left,int-ave,int-right)
{
int i=0,j=left,k=ave;
长计数=0;
虽然(j)您是否尝试使用IDE调试来检查代码行为?是否编写了代码测试?我测试了我的代码。当一个大的数据集被给定时,它给出了错误的答案。但是我找不到逻辑的错误。请提供一个您应该考虑使用的方法:您是否尝试使用IDE调试来检查您的代码行为?您是否编写了任何测试?对于你的代码?我测试了我的代码。当一个大的数据集被给予时,它给出了错误的答案。但是我找不到我的逻辑的错误。请提供一个你也应该考虑使用。