java - 我的合并排序实现中的运行时错误

标签 java algorithm

我编写了以下合并排序代码。

public class mergesort {

    public static int a[];

    public static void merges (int work[], int low, int high) {
        if (low==high)
            return;
        else {
            int mid = (low+high)/2;
            merges(work,low,mid);
            merges(work,mid+1,high);
            merge(work,low,mid+1,high);
        }
    }

    public static void main (String[] args) {
        int a[] = new int[] {64, 21, 33, 70, 12, 85, 44, 99, 36, 108};
        merges(a,0,a.length-1);
        for (int i=0; i<a.length; i++) {
            System.out.println(a[i]);
        }
    }


    public static void merge (int work[], int low, int high, int upper) {
        int j = 0;
        int l = low;
        int mid = high-1;
        int n = upper-l+1;
        while (low<=mid && high<=upper)
            if (a[low] < a[high])
                work[j++] = a[low++];
            else
                work[j++] = a[high++];
        while (low <= mid)
            work[j++]=a[low++];
        while (high <= upper)
            work[j++] = a[high++];
        for (j=0;j<n;j++)
            a[l+j]=work[j];
    }
}

它不起作用。编译后出现这样的错误:

java.lang.NullPointerException
    at mergesort.merge(mergesort.java:45)
    at mergesort.merges(mergesort.java:12)
    at mergesort.merges(mergesort.java:10)
    at mergesort.merges(mergesort.java:10)
    at mergesort.merges(mergesort.java:10)
    at mergesort.main(mergesort.java:27)

如何解决这个问题?

最佳答案

您有两个名为 a 的数组:

静态,mergesort.a:

public static int a[];

以及 main 中的局部变量:

int a[]=new int[]{64,21,33,70,12,85,44,99,36,108};

当您在 merge 中使用 a 时,您使用的是从未初始化过的静态成员。
如果你想初始化mergesort.a,你应该写

a = new int[]{64,21,33,70,12,85,44,99,36,108};

但是,这会让 merge 变得奇怪,因为它将有 work = a 作为参数,并引用静态 mergesort.a >,这将是同一个数组。

感到困惑吗?我也是... :)

关于java - 我的合并排序实现中的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2948642/

相关文章:

algorithm - 确定性有限自动机模式

java - 使用字典中没有共同字母的成对单词,找到一对最大化单词长度总和的单词

java - 在 Java 中使用 WebDriver 从 JSON 设置 PhantomJS

java - 检查两个 View 之间 Activity 的碰撞检测

java - 在 Intent 中传递 ArrayList<int[]>[] 的正确方法是什么?

Java-创建一个离散的彩虹色数组

c++ - 使用快速排序观察二次行为 - O(n^2)

java - 将 C++ 源代码编译为 .dll

algorithm - 合并无向图中的循环以创建树

java - 二叉树 : Node frequency count for 0, 1 或 2 个 child