比较插入排序的两个(几乎相同的)实现;其中一个失败
Comparing two (almost identical) implementations of Insertion Sort; one of them fails
基本上我在非工作实现中用aData[i]
替换了n
。我错过了一些根本性的错误吗?第二次实施在相同的测试数据上失败。
通过实施:
static long[] sort(long[] aData) {
for (int i = 1; i < aData.length; i++) {
long n = aData[i];
int j = i - 1;
while (j >= 0 && aData[j] > n) {
aData[j + 1] = aData[j];
j--;
}
aData[j + 1] = n;
}
return aData;
}
实施失败:
static long[] sort(long[] aData) {
for (int i = 1; i < aData.length; i++) {
int j = i - 1;
while (j >= 0 && aData[j] > aData[i]) {
aData[j + 1] = aData[j];
j--;
}
aData[j + 1] = aData[i];
}
return aData;
}
在 while 循环的第一次迭代中,j + 1 == i
。所以当你写 aData[j + 1] = aData[j]
时,你在循环内改变了 aData[i]
的值。
在初始版本中,n
在整个操作过程中是不变的。另请注意,使用 aData[i]
而不是 n
不太可能提高性能(如果有的话,它可能会更慢)。
基本上我在非工作实现中用aData[i]
替换了n
。我错过了一些根本性的错误吗?第二次实施在相同的测试数据上失败。
通过实施:
static long[] sort(long[] aData) {
for (int i = 1; i < aData.length; i++) {
long n = aData[i];
int j = i - 1;
while (j >= 0 && aData[j] > n) {
aData[j + 1] = aData[j];
j--;
}
aData[j + 1] = n;
}
return aData;
}
实施失败:
static long[] sort(long[] aData) {
for (int i = 1; i < aData.length; i++) {
int j = i - 1;
while (j >= 0 && aData[j] > aData[i]) {
aData[j + 1] = aData[j];
j--;
}
aData[j + 1] = aData[i];
}
return aData;
}
在 while 循环的第一次迭代中,j + 1 == i
。所以当你写 aData[j + 1] = aData[j]
时,你在循环内改变了 aData[i]
的值。
在初始版本中,n
在整个操作过程中是不变的。另请注意,使用 aData[i]
而不是 n
不太可能提高性能(如果有的话,它可能会更慢)。