黑马程序员技术交流社区

标题: 关于代码优化的问题 [打印本页]

作者: rolling-stone    时间: 2014-7-31 23:53
标题: 关于代码优化的问题
我这里有两个版本的冒泡排序的问题
第一个是我自己写的,没问题,可以实现排序.
第二个是毕老师写的,没问题,可以实现排序。
但是仔细想,毕老师写的比我写的要少了几次判断,我的写的有的时候多了几次判断.
我写的版本.
  1. class Sort()
  2. {
  3.         public void BubbleSort(int[] arr)
  4.         {
  5.                 for(int i=0; i<arr.length; i++)
  6.                 {
  7.                         for(int j=0; j<arr.length-1; j++)
  8.                         {
  9.                                 if(arr[j]>arr[j+1])
  10.                                 {
  11.                                         int temp = arr[j+1];
  12.                                         arr[j+1] = arr[j];
  13.                                         arr[j] = temp;
  14.                                 }
  15.                         }
  16.                 }
  17.         }
  18. }
复制代码
毕老师的版本:
  1. class Sort()
  2. {
  3.         public void BubbleSort(int[] arr)
  4.         {
  5.                 for(int i=0; i<arr.length-1; i++)
  6.                 {
  7.                         for(int j=0; j<arr.length-x-1; j++)
  8.                         {
  9.                                 if(arr[j]>arr[j+1])
  10.                                 {
  11.                                         int temp = arr[j+1];
  12.                                         arr[j+1] = arr[j];
  13.                                         arr[j] = temp;
  14.                                 }
  15.                         }
  16.                 }
  17.         }
  18. }
复制代码
显然后面的版本效率更高,但是有一个疑问就是,这个效率也不会体现的很清晰啊,是不是现在的数组还不够长的原因啊?





作者: 止询初衷    时间: 2014-7-31 23:54
额。。。。。。。。。。。。。。。
作者: rolling-stone    时间: 2014-7-31 23:55
止询初衷 发表于 2014-7-31 23:54
额。。。。。。。。。。。。。。。

大哥,不用发这么水的帖子吧,哈哈!
作者: 科篮    时间: 2014-8-1 00:03
for(int j=0; j<arr.length-1; j++)
已经排好序的你再比较有意义么?
作者: fxwb2005    时间: 2014-8-1 00:06
多比了几次而已,以现在CPU的速度来说,基本上没有影响……
作者: rolling-stone    时间: 2014-8-1 00:07
科篮 发表于 2014-8-1 00:03
for(int j=0; j

这是内层的循环,目的是比较相邻的两个元素的大小,外层循环目的是从头再比一遍,这样不断地比较,就会把最大值一直向后推,最小值一直向前推,看不出有什么问题啊?
作者: 科篮    时间: 2014-8-1 00:11
rolling-stone 发表于 2014-8-1 00:07
这是内层的循环,目的是比较相邻的两个元素的大小,外层循环目的是从头再比一遍,这样不断地比较,就会把 ...

比完一次你已经知道最后面的是最大的了,下一次比较的时候比到那前一个够了。再下一次再前一个。这样不是减少比较的次数了
作者: 辻方慑    时间: 2014-8-1 00:17
毕老师的更简洁
作者: fantacyleo    时间: 2014-8-1 00:20
不用纠结这个。从算法角度来说,冒泡排序没有任何显著的可优化之处,纯粹拿来练练手。所以,只要你的代码能得到正确的结果就好
作者: qq122609103    时间: 2014-8-1 00:28
顶一下 ~~~~~~~~~~~
作者: rolling-stone    时间: 2014-8-1 01:19
科篮 发表于 2014-8-1 00:11
比完一次你已经知道最后面的是最大的了,下一次比较的时候比到那前一个够了。再下一次再前一个。这样不是 ...

哦,大神,谢谢,我知道了,太感谢了!
作者: rolling-stone    时间: 2014-8-1 08:54
fantacyleo 发表于 2014-8-1 00:20
不用纠结这个。从算法角度来说,冒泡排序没有任何显著的可优化之处,纯粹拿来练练手。所以,只要你的代码能 ...

哦,好滴,那以后再开发的时候,关于算法方面是不是要求也不是很高了,大神.
作者: tianleboy    时间: 2014-8-1 09:11
lz   你仔细想一想就会发现其中的不同之处。首先我想说的是你copy毕老师的代码中 for(int j=0; j<arr.length-x-1; j++)这个代码是不是写错了,应该是 for(int j=0; j<arr.length-i-1; j++)才对。
  其次,你在想想,你写的代码中是循环的n的平方次。(也就是数组的长度的平方次)
                   而毕老师的循环次数在内循环中每次都少一次。也就少比较一次。所以毕老师的效率高点。
作者: a6511631    时间: 2014-8-1 09:20
fantacyleo 发表于 2014-8-1 00:20
不用纠结这个。从算法角度来说,冒泡排序没有任何显著的可优化之处,纯粹拿来练练手。所以,只要你的代码能 ...

被你发现了!就是面试和练习才用用
作者: fantacyleo    时间: 2014-8-1 10:33
rolling-stone 发表于 2014-8-1 08:54
哦,好滴,那以后再开发的时候,关于算法方面是不是要求也不是很高了,大神. ...

嗯,我没从事过实际开发,但从黑马的课程设置上来看,应该不太重要,倒不是说不会碰到复杂一些的算法,只是大多有别人写好的函数库或类库可以直接用,不用自己去实现。我看到一些比较资深的程序员博客,大意是说不管哪门语言,对程序员的基本要求是把该语言标准库中集合框架那些容器增删改查的算法效率搞明白,知道哪种场合用哪种容器
作者: 裤裆里的温柔、    时间: 2014-8-1 10:48
既然选择了冒泡排序还考虑什么算法
作者: rolling-stone    时间: 2014-8-1 10:53
fantacyleo 发表于 2014-8-1 10:33
嗯,我没从事过实际开发,但从黑马的课程设置上来看,应该不太重要,倒不是说不会碰到复杂一些的算法,只 ...

好的,谢谢,大神。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2