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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余宏 中级黑马   /  2012-5-17 13:37  /  2640 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void sort(int [] arr){
                for(int x=0;x<arr.length-1;x++){
                        for(int y = 0;y<arr.length-x-1;y++){//此处为什么是y<arr.length-x-1?
                                if(arr[y]>arr[y+1]){
                                        int temp = arr[y];
                                        arr[y] = arr[y+1];
                                        arr[y+1] = temp;
                                }
                        }
                }
        }

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 加油哦··

查看全部评分

8 个回复

倒序浏览
本帖最后由 吴兆焕 于 2012-5-17 14:36 编辑

其实我比较习惯arr.length-1-x这样写。
arr.length-1 比如数组长度为6,只用循环5次就可以排列好,所以要-1。

因为每循环一次,减一就可以完成排序,而x每循环1次,就会加1,所以就可以写成arr.length-1-x

你先要 理解 冒泡排序 的原理,你可以看毕老师讲的,04天-05课,主要理解他画的那个图。理解那个图,就能理解为什么。
回复 使用道具 举报
冒泡是两两互换.
y<arr.length-x-1 中的 y<arr.length-1 是最后一个元素后没有比较了  所以-1
因为你的第一次循环...两两互换 就能找到数组中最大的  
第一找到最大的,第二次循环就能找到第2大的..第一次运行后 y<arr.length-1  第二次是y<arr.length-2 ,第3次是y<arr.length-3...
以此类推
X是次数 ...每次循环X会自己加1                  y<arr.length-x-1

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如果不是y<arr.length-x-1,而是y<arr.length-x,就会造成角标越界,比如长度是5,当x=0的时候,y可以取4,然后下面有arr[y+1],这样就会出现arr[5]了,就是角标越界了。
回复 使用道具 举报
冒泡选择的外循环每循环一次,内循环就少一次比较,也就是说当x=0时,通过比较厚确定出最后角标位。当x=1时,内循环比较的时候就不会再去跟最后一位去比较,比较次数-1.同理当x=2时,就-2......所以通过循环发现,外循环没减少一次,内循环也就随之相应的变化,故应该y<arr.length-x。然后看内循环的条件,因为y跟y+1都处于内循环,所以都要满足其所处的内部环境,即:
y<arr.length-x
y+1<arr.length-x
两个结果求交集,就得到y<arr.length-x-1.

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我想在这里分享下我对冒泡排序的理解:
1.冒泡即形象的描述气泡由于在水中受压强的影响,从下往上越来越大;
  故应用到编程中,一串泡,是由小到大排列的、
2。给一串无规律的数字;
  按冒泡思想:第一次就冒出最大的,找出来了,还要排序的总数减一
              第二次就冒出剩余的最大的,找出来了,还要排序的总数再减一

              ......
              最后一次就是那个,不用找了,还要排序的总数为0;
//此处为什么是y<arr.length-x-1?
     arr.length-1 :因为最后那次不用找了
       再 - x :是因为已经找出了x个了
这样能明白不?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
hongbo 初级黑马 2012-5-17 14:26:02
7#
冒泡排序,看名字,就觉得和水泡一样,水泡距离水面越深,水泡越小,,水泡露出水面,你就可以想象它爆破了,没有了,
所以冒泡是先大的找出来排出来,最大的找出来后就不用再排了,
因为每次都是找一个排除,所以你排几次,就减几次,也就是i等于几的时候,你就认为排几次,!-1的原因是,数组下标从0开始取,所以最大下标为
arr.length-1.
回复 使用道具 举报
本帖最后由 古银平 于 2012-5-17 14:40 编辑

冒泡排序,是相邻两个元素相互比较,比如一个5元素的数组,然后符合条件就互换,
如果y<arr.length-x,外循环每循环一次,内循环条件y<arr.length-1,每次减1减2,减的就是外循环的x。外侧循环x=5时if(arr[y]>arr[y+1]),y+1=4, arr[y+1]就会越界,所以要减1。
回复 使用道具 举报
彩虹 中级黑马 2012-5-18 01:56:51
9#
      哥们,我用纯逻辑推理 的方式给你执行一下:
      比如:现有一个一维数组,其中存储有一列数,分别为:25,61,48,86,72,95 ,共6个数               
      冒泡排序的过程如下:
                 y=0:a[0]和a[1]比,即25和61比,不满足if条件,不进行交换
                 y=1:61与48比,满足if条件,交换,变为48  61
     x=0时  y=2:61与86比,不满足if条件,不进行交换  
                 y=3:86与72比,满足条件,交换,变为72  86
                 y=4:86与95比, 不满足if条件,不进行交换
                 y=5,不满足for循环条件,跳出循环
     由此,完成一趟冒泡排序,找到了最大数为95,冒泡排序其实就是大的数往下沉 ,没跑完一趟,找出一个相对最大数  
     接下来
     x=1时,进行第二趟排序,思想如同上面,一步一步推
     ........
    最终,可得出由小到大的一列有序数。即:25,48,61,72,86,95


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