jtandygod 2012-09-24 16:55 采纳率: 100%
浏览 212
已采纳

关于插入排序"避免明显地使用交换"的优点(JAVA实现) 好处何在呢?

void insertionSort(AnyType[] a)
{
int j;

for(int p=1;p {
AnyType tmp=a[p];
for(j=p;j>0&&tmp.compareTo(a[j-1])<0;j--)
a[j]=a[j-1];
a[j]=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;
}

为什么"避免明显地使用交换"呢?这样作有什么好处呢?更快吗??望指导

  • 写回答

2条回答 默认 最新

  • jinnianshilongnian 2012-09-24 18:57
    关注
      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] 可以节约计算。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记