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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 遮天 中级黑马   /  2014-4-1 10:41  /  1413 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 遮天 于 2014-4-2 06:35 编辑

/*

        冒泡排序

*/

class Demo
{
        public static void main(String[] args)
        {
                int[] arr = {1,3,5,7,9,2,4,6,8};

                export(arr); //排序前输出
                sort(arr); //排序
                export(arr); //排序后输出
        }
               
        //排序函数
        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++)
                        {
                                if(arr[y]>arr[y+1])
                                {        
                                                
                                        replace(arr, y, y+1);

                                }
                        }
                }
        }
               
        //输出函数
        public static void export(int[] arr)
        {
                for(int x=0; x<arr.length; x++)
                {
                        if(x!=arr.length-1)
                                System.out.print(arr[x]+",");
                        else
                                System.out.println(arr[x]);
                }
                        
        }
               
        //置换函数,设置第三方变量进行两个数的互换
        public static void replace(int[] arr, int x, int y)
        {
                int tem=arr[x];
                        arr[x]=arr[y];
                        arr[y]=tem;
        }
}


我想问的是在排序函数中
        
        //排序函数
        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++)
                        {
                                if(arr[y]>arr[y+1])
                                {        
                                                
                                        replace(arr, y, y+1);

                                }
                        }
                }
        }




for(int x=0; x<arr.length-1; x++)

x<arr.length-1  为嘛要减 1  ???不减 1 也能运行啊?

求解释......

点评

发帖的时候将代码放到代码块中,这样又便于别人阅读!  发表于 2014-4-1 23:56

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 黄晓鑫 于 2014-4-1 10:46 编辑

因为最后一个不需要排序啊,排了就等于浪费资源。比如有六个人,小的人都往前面走,最后一个肯定就是最大的了,还需要排吗?

回复 使用道具 举报
本帖最后由 MK_Chan 于 2014-4-1 11:42 编辑

为了让楼主更容易理解,我结合一下算法的步骤来解析一下吧。
冒泡排序的原理我就不用多讲了吧,楼主给出的“//排序函数”就是属于冒泡排序算法了。

第一个问题:x<arr.length-1  为嘛要减 1  ?
我们假设两种情况:
一、x<arr.length;
以开始的数组 int[] arr = {1,3,5,7,9,2,4,6,8};为例。
数组有9个元素,所以arr.length=9,所以x能达到的最多值为8。
当算法进行最后一次比较的时候:
我们看代码int y=0; y<arr.length-x-1;x取到最大值为8。
所以这个代码为y=0;y<0。显然这个循环条件是不成了的,所以不会进入循环里面的判断。
所以当y=0的时候:if(arr[y]>arr[y+1])也就是if(arr[0]>arr[1])是没有被执行的,也就是说这个冒泡排序是不完整的。

二、x<arr.length-1;
以开始的数组 int[] arr = {1,3,5,7,9,2,4,6,8};为例。
数组有9个元素,所以arr.length=9,所以x能达到的最多值为7。
当算法进行最后一次比较的时候:
我们看代码int y=0; y<arr.length-x-1;x取到最大值为7。
所以这个代码为y=0;y<1。显然这个循环条件成立,所以会进入循环里面的判断。
所以当y=0的时候:if(arr[y]>arr[y+1])也就是if(arr[0]>arr[1])被执行,算法完整,冒泡排序完成。

第二个问题:不减 1 也能运行啊?
程序是可以运行的,只是冒泡排序不完整,看第一种情况最后那里的解析。

【求加技术分 T 。T】

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 当不是为了技术分而回答得时候 那么黑马离.

查看全部评分

回复 使用道具 举报
这么解释吧,因为冒泡排序是数组中的前一个元素和后一个元素进行比较,那么,就如你刚刚所说,x<arr.length-1 ,首先,length是数组的长度,也就是数组中有效的参与排序比较的元素的个数,如果当x<arr.length,那么循环条件仍然满足,而x是从0开始计算,那么下一次比较的时候是不是就到了arr[length-1]和arr[length]比较?又因为数组下标最大值就是arr.length-1,那么此时,arr[length]编译系统就不认识了,就会出现角标越界异常。
回复 使用道具 举报
因为最后面就只剩一个了,一个跟自己比啊?没必要啊,所以最后那一个比较省了,所以减1
回复 使用道具 举报
arr.length返回数组arr元素个数,而数组下标是从0开始的,所以数组arr最后一元素是数组元素个数减1,如果不减一的话会造成数组下标越界,很危险,因为编译器不检查数组下标时否越界,所以要注意这一点哦!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马