下面是两个插入排序,很简单,它俩的唯一不同用红色标注。
public static void insert(int[] a)
{
for(int i = 1; i < a.length; i++)
{
int key = a[i];
int j = i - 1;
while(j >= 0 && key < a[j])//这个是将 j>=0 放在前面
{
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
public static void insert(int[] a)
{
for(int i = 1; i < a.length; i++)
{
int key = a[i];
int j = i - 1;
while( key < a[j] && j >= 0 )//这个是将 j>=0 放在后面
{
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
这个问题就出来了,如果放在后面,当j=-1时,会先出现数组越界,导致程序失败。而放在后面,会先判断条件,然后会发生短路,忽略数组越界。
心得:写程序写出来是基本,但是严谨性与缜密性往往是面试时考察的重点。如果面试官让你写一个算法而不是一个程序,你会考虑到这一点吗?