2014-05-25 69 views
0
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]我应该做些什么才能完成这项工作

为什么此插入排序代码不能按预期工作?

+2

它做什么,你期望它做什么? –

+0

预计按升序对int数组进行排序。对于输入数组{1,2,3,7,8,6,100,99,98},它给出输出[1,2,2,2,2,2,2,2,2,2] – Rpant

+0

你试过了吗?逐步调试您的代码和/或打印各种变量的值以更好地理解发生了什么?特别是,这看起来很诡异:'for(j = i-1; j> = 0 && temp assylias

回答

3

通过将temp = a[i]置于外部循环的初始化子句中,确保它只运行一次。在你给出的例子中,temp将被分配为2,并且你永远不会改变它。

然后在循环的其余部分,您最终将temp的值分配给数组中的其他条目,只要有更大的条目。因此,大部分数组最终设置为2.

因此temp = a[i]需要位于外部循环体中,而不是其初始化子句中。

+0

我不敢相信我那样做了。不过谢谢。 – Rpant

相关问题