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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xieguanxiong 黑马帝   /  2012-3-2 11:06  /  2339 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void bubbleSort(int[] arr)
        {
                for(int x=0; x<arr.length-1; x++)
                {                                                                       
                        for(int y=0; y<arr.length-x-1; y++)这的-x和-1问题?
                        {
                                if(arr[y]<arr[y+1])
                                {
                                       
                                        int temp = arr[y];
                                        arr[y] = arr[y+1];
                                        arr[y+1] = temp;
                                       
                                                                        }
                        }
                }
        }
for(int y=0; y<arr.length-x-1; y++)-x和-1问题?

2 个回复

正序浏览
-1是因为两两相比较,要少比较一次,比如三个数两两相比较只要比较二次。
-x是因为外循环没执行一次内循环就少比较x次。
你不减x程序也是对的。但是-x是对代码的一次优化。因为后面的x个是不需要比较的。
回复 使用道具 举报
本帖最后由 qwert 于 2012-3-2 11:27 编辑

首先,你要了解什么是冒泡排序,也就是说,如果是从小到大排序的话,临近的两个数进行比较,大数不断右移,那么,一轮下来,最右边的那个数,肯定是这个数组中最大的值。
例:有数组int[] arr ={7,12,8,9,20,6,5,3}  ,这个数组中7先和12比较,没12大,然后12再和8比较,12比8大,所以12要右移,以此类推……这样,一轮下来,最右边的数字肯定是20,那么下一局,这个最右边的20就不用参与比较了,因为肯定它最大。所以x的意义就是为了控制循环次数,当x=0的时候,也就是还没有比较,所以,用通过循环遍历数组中的所有元素,把最值存放在最后一个地址上。当x=1的时候,说明已经循环过一次,数组中最后一个元素已经是最大值,不需要参与运算了,也就没必要再让它比较。x=2的时候,则是有两个元素不必要参与运算……以此类推……所以要-x
这个数组arr.length的结果为8,下脚标也就是到7.当y=7的时候,arr[y+1]=8,这就造成了数组越界,为了防止越界,故需要在这个基础上减去1,让y的值最大取到6,那么arr[y+1]最大也就能到7。
希望这样说能解开些您的疑惑~

其实,您仔细多看下毕老师的视频多品味下,就能理解了。我也是没事儿就研究老视频,很多时候都能发现新问题和新体会。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

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