A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 星痕月影 初级黑马   /  2018-4-7 20:20  /  1137 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

       距离我们学习最简单的入门代码HolloWorld已经过去了半个多月了,基础代码量也从几行到几十行到多个类几百行的程度。在这过程中,有一个问题开始一步步展现在我们面前,代码如何才能做到最高效的得到运行结果?
      例如最基本的冒泡排序:
1  public static void bubbleSort1(int [] a){   
2      
3     int i, j;
4     for(i=0; i< a.length; i++){//表示n次排序过程。
5          for(j=1; j< a.length -i; j++){
6              if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换
7                  //交换a[j-1]和a[j]
8                  int temp;
9                  temp = a[j-1];
10                  a[j-1] = a[j];
11                  a[j]=temp;
12             }
13          }
14    }
      这个功能代码只有短短12行,但是却在很多地方地方都特别注意代码效率的问题。整个程序循环体进行了n*n次运算,也是这块功能代码最费资源的地方,其余语句的运算量可以以代码行数粗略估计。
  第5行的j< a.length -i就是很好的体现了这一思想
因为对于这里来说j< a.length和j< a.length -i  的效果是一样的,但是后者可以比前者少更多的不必要计算,因此减少了代码的运行量,提高了代码运行效率。
‚  第8,9,10行体现的是java对于两个变量互换变量值的方法,对于这个更抽象的方法我们可以有一个更直观的方法,如下
int temp1=a[j];
int temp2=a[j+1];
a[j]=temp2;
a[j+1]=temp1;
这四行代码相对于8,9,10,行代码肯定更易于读懂,因为人们一看就知道是把两个变量互换值,但是为什么java还是选择只创建一个变量呢?归根结底,还是为了节省内存空间,给其它代码的运行提供更多的内存空间。
      当然,以上两点都是基于代码本身给出的优化方案,除此之外,还可以根据代码的原理给出优化方案。例如,排序算法可能在某次执行之后已经完成了排序,但是冒泡算法还是很勤勤恳恳的执行了n*n次,然而后面的几次完全是没有必要的执行过程,所以可以在每一趟的排序后定义一个flag判断是否发生了交换数据,但返回值是false是则可以中断排序,给出结果,
      虽然这样做是会增加代码量,但是,代码量少并不等于运行效率高,有时候更多的代码也能创造出效率更高的算法。优化代码并不应该局限于减少代码量,而是应该注重于减少代码运算量。但是于此同时,更高效的代码是否也会占用更多的系统资源?结果是显而易见的,如上例子就是增加一个布尔变量作为跳出循环比较的判断依据。所以,我们在实际编程中应该追求代码的高效性,而又不能一位的追求代码的高效性,应该与实际的硬件条件相符。

1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马