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 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错