您开始e
太低,应该是m + n + 1
。
想一想,对于两个三元阵列,m
和n
都是两个。这意味着你将以四分之一开始m + n
,而六分的结果应该从五分开始。
这是一个相对简单的错误。
您也可以修复其他当它们相等时丢失值的问题,只需忽略相等性。如果它大于或等于,则选择a
,否则选择b
。
而你的循环连续逻辑是错误的,你会看到如果你用尽a
第一(使用a = {2, 2, 3}
和b = {1, 7, 8}
来看看我的意思)。如果a
和b
都剩下元素,则只能继续。你应该继续,而要么他们有元素。
你可以通过保持原样,但添加两个其他循环(其中只有一个实际上会做任何事情)来消除另一个列表。
作为支撑,我提供了下面的C代码(因为我与比Java快,但排序过程本身应该是差不多相同):
#include <stdio.h>
void sort (int a[], int b[], int m, int n) {
// Start at correct offset for target array.
int e = m + n + 1;
// Until one list empty, choose the correct value.
while (m >= 0 && n >= 0)
if (a[m] >= b[n])
a[e--] = a[m--];
else
a[e--] = b[n--];
// If b was empty, just transfer a.
while (m >= 0)
a[e--] = a[m--];
// If a was empty, just transfer b.
while (n >= 0)
a[e--] = b[n--];
}
和一些测试代码:
int main(void) {
int a[6] = {2,2,3};
int b[] = {1,7,8};
sort (a, b, 2, 2);
printf ("%d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5]);
return 0;
}
的这个输出是:
1 2 2 3 7 8
如预期。
以及等效的Java代码:
class Test {
static void sort (int a[], int b[], int m, int n) {
// Start at correct offset for target array.
int e = m + n + 1;
// Until one list empty, choose the correct value.
while (m >= 0 && n >= 0)
if (a[m] >= b[n])
a[e--] = a[m--];
else
a[e--] = b[n--];
// If b was empty, just transfer a.
while (m >= 0)
a[e--] = a[m--];
// If a was empty, just transfer b.
while (n >= 0)
a[e--] = b[n--];
}
其测试套件一起:
static public void main(String[] args) {
int a[] = new int[6];
a[0] = 2; a[1] = 2; a[2] = 3;
int b[] = new int[3];
b[0] = 1; b[1] = 7; b[2] = 8;
sort (a, b, 2, 2);
for (int i = 0; i < 6; i++)
System.out.println (a[i]);
}
}
事实上,因为你反正写a
,你可以实际上忽略了中间循环(while (m >= 0)
之一)。那是因为在这种情况下,你只是简单地将元素转移到自己身上。
,因为它变得很重要,如果你正在写的数组不是就地但如果你想为你的特殊情况下,你可以将其删除,我会离开进去。
语言吗? (标签) – paislee 2012-02-14 01:21:41