public static void insertionSort(int[] a) {
if (a == null || a.length < 2)
return;
int j;
for (int i = 1, temp = a[i]; i < a.length; i++) {
for (j = i - 1; j >= 0 && temp < a[j]; a[j + 1] = a[j], j--);
a[j + 1] = temp;
}
}
期望按升序对int数组进行排序。但对于输入数组{ 1, 2 ,3 , 7 , 8 , 6 , 100 , 99 , 98}
,它会提供输出[1, 2, 2, 2, 2, 2, 2, 2, 2]
。
为什么此插入排序代码无法按预期工作?
答案 0 :(得分:3)
通过将temp = a[i]
放在外部循环的初始化子句中,可以确保它只运行一次。在您提供的示例中,temp
将被分配2
,您永远不会将其更改为其他任何内容。
然后在循环的其余部分,只要有更大的条目,就会最终将temp
的值分配给数组中的其他条目。因此大多数数组最终都设置为2。
所以temp = a[i]
需要在外部循环的主体中,而不是在其初始化子句中。