public class InsertSort{

public void insert(){
int a[]={33,2,11,43,0,431,123,3,2,4,3};
int l,b,c,key;
l=a.length;
for(int i=1;i<l;i++){
c=i;
key=a[i];
for( b=c-1;b>=0;b--){
if(a[b]>key){

a[c]=a[b];
c--;
}
else break;   //为什么把这一步注销了不行,起什么作用?

}
a[b+1]=key;//如果上面那一步注销了,把b+1改为c也可以正确执行,这又是为什么 



}
for(int d=0;d<l;d++){
System.out.println(a[d]);
}


}
public static void main(String args[]){
InsertSort abc=new InsertSort();
abc.insert();

}

}

解决方案 »

  1.   

    变量名尽量规范点,l和1不容易分辨
    数组越界   for(int i=1;i<l;i++)
    else break;是判断如果不符合上面条件就跳出
      

  2.   

    else break;去掉的话,最外边循环会继续,这时,b=c-1这句已经执行,因为b=c-1;
    后面[b+1]实际等于 [c-1+1],最后等于[c]
      

  3.   

    break是为了跳出里层的循环。c = i;b = c - 1;c--; b--所以 b+1 = c;
      

  4.   

    应该是这样,如果没有else break 最里面for语句还会继续执行,直到b减小为-1,这样B+1和C不等。,C正确,但B+1错误。原来只是简单的for 语句,基础没掌握好,·
      

  5.   

    好像来晚了。那个与冒泡排序有点类似,外循环从第二项开始,第i项都要和前面所有比他大的比较,而且前面的所有项都已经是从小到大排好了。直到找到比他大的最小数为止,即else break; 在此过程中始终有b+1==c,遍历(c--)到的数据都向后移了一位,直到最小比key大的数,位置是c,此时a[c]=key,即a[b+1]=key如果没有else break 的话,b+1 就不再等于C了,这样可能就打乱了前面已经排好的队列了。