Java 合并排序算法有问题吗
我目前正在尝试将mergesort算法从伪代码级别转录到java中的工作实现。这是我的密码Java 合并排序算法有问题吗,java,algorithm,sorting,merge,mergesort,Java,Algorithm,Sorting,Merge,Mergesort,我目前正在尝试将mergesort算法从伪代码级别转录到java中的工作实现。这是我的密码 public int[] merge(int a[], int b[]) { int c[] = new int[a.length + b.length]; int i = 0, j = 0; for (int k = 0; k < c.length; k++) { if (a[i] <= b[j]) {
public int[] merge(int a[], int b[]) {
int c[] = new int[a.length + b.length];
int i = 0, j = 0;
for (int k = 0; k < c.length; k++) {
if (a[i] <= b[j]) {
c[k] = a[i++];
} else {
c[k] = b[j++];
}
}
return c;
}
public int[]合并(int a[],int b[]{
int c[]=新int[a.length+b.length];
int i=0,j=0;
for(int k=0;k 如果(a[i]您打算实现它的合并算法更详细一些,下面您将找到一个正确的实现:
public int[] merge(int a[], int b[]) {
int i = 0, j = 0, k = 0;
int m = a.length, n = b.length;
int[] c = new int[m + n];
// Merge to the end of one of the source arrays
while (i < m && j < n) {
if (a[i] <= b[j]) {
c[k] = a[i];
i++;
} else {
c[k] = b[j];
j++;
}
k++;
}
// Determine which source array has elements remaining and
// append those to the result array
if (i < m) {
for (int p = i; p < m; p++) {
c[k] = a[p];
k++;
}
} else {
for (int p = j; p < n; p++) {
c[k] = b[p];
k++;
}
}
return c;
}
public int[]合并(int a[],int b[]{
int i=0,j=0,k=0;
int m=a.长度,n=b.长度;
int[]c=新的int[m+n];
//合并到一个源数组的末尾
而(i 如果(a[i],这显然会产生越界异常,因为您没有跟踪a
和b
数组的长度。由于k=a+b
,a
和b
总是小于k
,因此出现异常
当您应用此检查时,请记住复制剩余的项目,无论它们是a[]
还是b[]
,以将它们复制到c[]
。请参见此-
for(;i<a.length;i++)
c[k++] = a[i++];
for(;j<b.length;b++)
c[k++] = b[j++];
for(;i考虑当a[a.length-1]
b[0]
:您运行整个a
数组,将i
增加到a.length
,然后尝试将a
中不存在的元素与b
的第一个元素进行比较。您需要主动检查一个数组的结尾,一旦发生这种情况,只需运行另一个。@dlev关于c的说法是正确的因为,虽然这根本不是边缘情况。不管发生什么情况,你都会先用一个数组完成另一个数组,当这种情况发生时,你需要能够从另一个数组完成填充。@MarkPeters的确,我并不是有意暗示这是边缘情况。我只是想用一个“极端”的例子来说明这一点。