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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 枫儿 金牌黑马   /  2013-10-8 18:50  /  2215 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-10-8 21:10 编辑

  1.         public static void bubbleSort(int[] arr)
  2.         {
  3.                 for(int x=0; x<arr.length-1; x++)
  4.                 {                                                                        
  5.                         for(int y=0; y<arr.length-x-1; y++)
  6.                         {
  7.                                 if(arr[y]<arr[y+1])
  8.                                 {
  9.                                         int temp = arr[y];
  10.                                         arr[y] = arr[y+1];
  11.                                         arr[y+1] = temp;
  12.                                         swap(arr,y,y+1);
  13.                                 }
  14.                         }
  15.                 }
  16.         }
复制代码
上面是毕老师的冒泡排序的代码,但是他的思路是对数组进行遍历后比较旁边的角标的值大小,再置换位置吗???那arr.length-1是为何呢???

评分

参与人数 1技术分 +1 收起 理由
To + 1 好好去看视频。视频都有的东西.

查看全部评分

6 个回复

倒序浏览
冒泡排序的实现方式是:相邻的两个元素比较,如果符合条件则把较大的元素换到右边。而不是角标换位。依次类推。
外循环是控制循环次数的。到最后一个元素之后就没有相邻的元素,所以要减除1。
你可以再把视频看一遍,老师讲到了。

评分

参与人数 1技术分 +1 收起 理由
To + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 winsking 于 2013-10-8 20:01 编辑

冒泡排序是比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

因为是比较两个相邻的,而最后一个元素后面没有元素了,比到倒数第二个,就是在比较最后两个元素, 所以要减1,否则会角标越界,报错的

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
冒泡排序的思路是从头开始比较待排序的元素,在这个过程中依次对相邻元素进行比较,将值大的元素后移。每经过一次排序后,值最大的元素将移到末尾,记下该元素的位置,下一趟排序只需要比较到此位置为止,直到所有元素都已有序排列。
arr.length-1是因为对y个元素进行冒泡排序,总共需要进行y-1趟。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
因为数组的最后一个元素之后就没有相邻的元素,所以要减除1。给你打个比方  12345  5个数  序号是01234
当你遍历之后最后一遍你会发现4之后就没有数了。所以需要数组长度-1

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报

冒泡排序,其实是相邻两个元素进行比较,如果符合条件两元素就进行位置互换。直到最后一位,就是这组数组的最值。
比如说,一组数组有3个数{5,1,2},我要按 小到大的顺序排序,就是先5和1比较,5比1大,就置换位置,然后相邻的两位继续,就是5和2比,继续置换位置,最后,最右边的数组就是这组数组的最大值。
定义初始值的角标为0,就像你贴出来的这个代码。
然后那个arr.length-1,
第一个for循环里面的-1,不减也可以,因为这个会使得0角标和自己比较,没有意义,你可以自己试着编译一下。
第二个for循环里面的-1必须存在,因为arr.length是数组的长度,是从1开始的,而角标却是从0开始的,你要不减1的话,角标就会越界
回复 使用道具 举报
气泡在水中上浮.
大数(小数)在数组中往后移动.
前后比较.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马