void MERGE(String[]A, int p, int q, int r) {
int n1 = q - p + 2;
int n2 = r - q + 1;
String[] L = new String[n1];
String[] R = new String[n2];
int i,j;
for (i = 0; i < L.length; i++) {
L[i] = A[p+i];
}
for (j = 0; i < R.length; j++) {
R[j] = A[q+j+1];
}
L[n1-1] = "";
R[n2-1] = "";
i = 0;
j = 0;
for (int k = p; k <= r; k++) {
if (L[i].compareToIgnoreCase(R[j]) < 0) {
A[k] = L[i];
i++;
}
else {
A[k] = R[j];
j++;
}
}
}
public void MERGE_SORT(String[] A, int p, int r) {
if (p < r) {
int q = (p+r)/2;
MERGE_SORT(A, p, q);
MERGE_SORT(A, q+1, r);
MERGE(A, p, q, r);
}
}
这个算法最初用于整数,这是我如何改变它来排序字符串。我得到一个NullPointerException。问题似乎是在compareToIgnoreCase()行。这甚至是你如何实现字符串的mergesort?
public static void main(String[] args) {
String[] sA = {"Jack", "John", "Mike", "Moss", "Xo"};
Sort ob = new Sort();
ob.MERGE_SORT(sA, 0, sA.length - 1);
}
答案 0 :(得分:2)
方法MERGE
中的第二个for循环使用错误的变量i
(而不是j
)来检查上限(i < R.length
)。它应该是:
for (j = 0; j < R.length; j++) {
R[j] = A[q+j+1];
}
除此之外,代码还有两个问题:
(1)用于初始化L和R的for循环应分别运行到L.length - 1
R.length - 1
:
for (i = 0; i < L.length - 1; i++) {
L[i] = A[p + i];
}
for (j = 0; j < R.length - 1; j++) {
R[j] = A[q + j + 1];
}
(2)你在L和R的最后一个位置使用了一个标记,以保证合并for循环永远不会超过数组。此标记应大于数组中可能的最大值。如果是int[]
,这可能是Integer.MAX_VALUE
(这与最大可能元素一样大,但这可能是可以接受的)。但是,由于您拥有String
数组,因此您需要尽可能大的String
值。您正在使用空字符串(""
),这是最小的String
:
L[n1 - 1] = "";
R[n2 - 1] = "";
对于测试,您可以使用类似"ZZZ"
的内容,但是您应该重写合并算法,以便在没有哨兵的情况下工作:
L[n1 - 1] = "ZZZ";
R[n2 - 1] = "ZZZ";