Java 插入排序 - 向下复制数组中的值
Java Insertion Sort - copying values down array
我需要让这个插入排序函数从本质上将元素复制到右边,直到需要移动的值位于正确的位置,但是,对于我使用的代码,我通常最终会得到垃圾,并尝试了多次迭代,结果相同。我无能为力,因为我看不出为什么这不起作用。
public static void Sort(Comparable[] a) {
int n = a.length;
Comparable temp = 0;
int x;
// Starting with the element at index 1...
for (int i = 1; i < n; i++) {
// ...move to the left until we find one less
// than the current element.
for (int j = i; j > 0; j--) {
if (less(a[j], a[j - 1]))
{
temp = a[j];
for(x = j; x > 0 && less(temp, a[x]); x--)
{
a[x] = a[x - 1];
}
a[x] = temp;
//exch(a, j, j - 1);
}
else
break;
}
}
}
less(a, b) 顺便检查是否 a < b。
在最内层循环的第一次迭代中,在这种情况下:x > 0 && less(temp, a[x])
您正在检查您刚刚存储在 temp 中的值...是否小于您刚刚存储在 temp 中的值,参考以另一个名字。这将始终 return false,导致循环永远不会开始。最终结果是整个方法是一个代价高昂的空操作。如果你通过发送一个随机混乱的数组来测试它,你最终会得到这个数组,当它完成时仍然是随机混乱的。
要解决此问题,只需从该条件下的索引中减去 1,使其成为 x > 0 && less(temp, a[x - 1])
。
我认为您的其余代码看起来是正确的,尽管带有 j
的循环是多余的并且可以删除。
这应该可以解决问题
public static void Sort(Comparable[] a) {
int n = a.length;
Comparable temp = 0;
int x;
// Starting with the element at index 1...
for (int i = 1; i < n; i++) {
// ...move to the left until we find one less
// than the current element.
for (int j = i; j > 0; j--) {
if (less(a[j], a[j - 1]))
{
temp = a[j];
for(x = j; x > 0 && less(temp, a[x-1]); x--)
{
a[x] = a[x - 1];
}
a[x] = temp;
//exch(a, j, j - 1);
}
else
break;
}
}
}
我需要让这个插入排序函数从本质上将元素复制到右边,直到需要移动的值位于正确的位置,但是,对于我使用的代码,我通常最终会得到垃圾,并尝试了多次迭代,结果相同。我无能为力,因为我看不出为什么这不起作用。
public static void Sort(Comparable[] a) {
int n = a.length;
Comparable temp = 0;
int x;
// Starting with the element at index 1...
for (int i = 1; i < n; i++) {
// ...move to the left until we find one less
// than the current element.
for (int j = i; j > 0; j--) {
if (less(a[j], a[j - 1]))
{
temp = a[j];
for(x = j; x > 0 && less(temp, a[x]); x--)
{
a[x] = a[x - 1];
}
a[x] = temp;
//exch(a, j, j - 1);
}
else
break;
}
}
}
less(a, b) 顺便检查是否 a < b。
在最内层循环的第一次迭代中,在这种情况下:x > 0 && less(temp, a[x])
您正在检查您刚刚存储在 temp 中的值...是否小于您刚刚存储在 temp 中的值,参考以另一个名字。这将始终 return false,导致循环永远不会开始。最终结果是整个方法是一个代价高昂的空操作。如果你通过发送一个随机混乱的数组来测试它,你最终会得到这个数组,当它完成时仍然是随机混乱的。
要解决此问题,只需从该条件下的索引中减去 1,使其成为 x > 0 && less(temp, a[x - 1])
。
我认为您的其余代码看起来是正确的,尽管带有 j
的循环是多余的并且可以删除。
这应该可以解决问题
public static void Sort(Comparable[] a) {
int n = a.length;
Comparable temp = 0;
int x;
// Starting with the element at index 1...
for (int i = 1; i < n; i++) {
// ...move to the left until we find one less
// than the current element.
for (int j = i; j > 0; j--) {
if (less(a[j], a[j - 1]))
{
temp = a[j];
for(x = j; x > 0 && less(temp, a[x-1]); x--)
{
a[x] = a[x - 1];
}
a[x] = temp;
//exch(a, j, j - 1);
}
else
break;
}
}
}