AnyType tmp=a[p]; //此局部变量只赋值一次
for(j=p;j>0&&tmp.compareTo(a[j-1])<0;j--)
a[j]=a[j-1]; //移动到相应位置
a[j]=tmp; //最后一次插入
假设p=6 a[p]=2 a[0]-----a[5] 2,3,7,8,9,10 按照如上算法是
1、tmp=6;
2、a[5]移到a[6] a[4]移到a[5] a[3]移到a[4] a[2]移到a[3]
3、a[2]=tmp
for(j=p;j>0&&tmp.compareTo(a[j-1])<0;j--) {
AnyType tmp=a[p]; //获取要插入的字符
a[j]=a[j-1]; //
a[j]=tmp;
}
算法如下:
1、tmp=6; a[5]移到a[6] a[5]=tmp;
2、tmp=6; a[4]移到a[5] a[4]=tmp;
3、tmp=6; a[3]移到a[4] a[3]=tmp;
4、tmp=6; a[2]移到a[3] a[2]=tmp;
可以看到第二种 交互次数明显比第一次多 即最后一次 a[n]=tmp 只有最后一次才是有效的 之前的都是无效的移动 浪费时间
改进
AnyType tmp=a[p]; //此局部变量只赋值一次
AnyType current=null;
for(j=p;j>0&&tmp.compareTo((current=a[j-1]))<0;j--)
a[j]=current; //移动到相应位置
a[j]=tmp; //最后一次插入
a[j-1] 内部需要多条指令完成:
6: aload_1 //数组压栈
7: iload_2 //压入j
8: iconst_1 //压入常量1
9: isub //j-1
10: iaload //加载数组的第j-1个数据
即a[j-1] 如果重复多次其实很耗时 因此current=a[j-1] 可以节约计算。