2 回答
TA贡献1874条经验 获得超12个赞
a我认为,当数组之一(或者或b)已经为空,而另一个 - 仍然有元素时,您将面临这种情况。所以,在merge函数中你应该考虑到这一点。
这是您的完整实现mergeSort:
public class Answer {
public static void main(String[] args) {
int[] unsorted = new int[]{4,3,4,2,1,1,3,3,3,3,3,5,6,6,9,9,10,7,7,8};
System.out.println(Arrays.toString(mergeSort(unsorted)));
}
public static int[] mergeSort(int[]a) {
if (a.length == 1) return a;
int[] q = new int[a.length];
int[] l = new int[a.length / 2];
int [] r = new int[a.length - l.length];
for (int i = 0; i < l.length; i++) {
l[i] = a[i];
}
for (int i = 0; i < r.length; i++) {
r[i] = a[l.length + i];
}
q = merge(mergeSort(l), mergeSort(r));
return q;
}
private static int[] merge(int[]a, int[]b) {
int length = a.length + b.length;
int[] c = new int[length];
int p = 0;
while (a.length > 0 && b.length > 0) {
if (a[0] < b[0]) {
c[p++] = a[0];
a = tail(a);
} else {
c[p++] = b[0];
b = tail(b);
}
}
while (a.length > 0) {
c[p++] = a[0];
a = tail(a);
}
while (b.length > 0) {
c[p++] = b[0];
b = tail(b);
}
return c;
}
private static int[] tail(int[] a) {
int[] t = new int[a.length - 1];
for (int i = 0; i < t.length; i++) {
t[i] = a[i + 1];
}
return t;
}
}
TA贡献1797条经验 获得超6个赞
其实你的辅助方法有问题merge()。
我强烈建议您以此为契机,对您的方法进行系统测试。考虑到我们在编写程序时都会经常犯错误,发现错误以纠正错误是工作的真正组成部分。
让事情变得更容易的是对这个事实进行预测:sh*t发生。并花时间写下一些测试用例,包括输入数据和预期结果。
int[] empty = {};
int [] r1 = merge(empty, empty);
System.out.println("Result should be empty\n");
printArray(r1);
int [] oneElement = { 23 };
int [] r3 = merge(oneElement, empty);
System.out.println("Result should be [23]\n");
printArray(r2);
...
所以你有自动化测试(我们都懒得在代码第 35 次修改后每次都手动完成°.
这将引导您进行“单元测试”....
添加回答
举报