Ошибка выполнения в моей реализации сортировки слиянием - PullRequest
2 голосов
/ 01 июня 2010

Я написал следующий код слияния.

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)

Как можно решить эту проблему?

1 Ответ

6 голосов
/ 01 июня 2010

У вас есть два массива, называемых a:

статическими, mergesort.a:

public static int a[];

и локальной переменной в main:

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

Когда вы используете a в merge, вы используете статический член, который никогда не инициализировался.
Если вы хотели инициализировать mergesort.a, вы должны были написать

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

Однако, чтосделало бы merge странным, поскольку он будет иметь work = a в качестве аргумента и ссылку на статический mergesort.a, который тогда будет таким же массивом.

Смущен?Я тоже ... :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...