黑马程序员技术交流社区

标题: 关于,数组冒泡排序时,的问题 [打印本页]

作者: 张占忠    时间: 2012-12-22 10:15
标题: 关于,数组冒泡排序时,的问题
昨天看 基础06-04 的时候,遇到了一个问题!原来这么写的!
public static int[] bubbleSort(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]){
                                swap(arr,y,y+1);
                        }
                        }
        }
        return arr;
}
确实,没有什么,但是 我如果! 在第一个,FOR循环里 加上一个-x, 他们两个的结构,是一样的!然后,我就蒙了!
public static int[] bubbleSort(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]){
                                swap(arr,y,y+1);
                        }
                        }
        }
        return arr;
}

问题是, 外部FOR,循环了几次! 内部循环了几次。结果,是如何遍历出来的?
作者: 张占忠    时间: 2012-12-22 10:17
对不起,发错了,第二个,程序是这样的!
public static int[] bubbleSort(int[] arr){
        for (int x=0; x<arr.length-x-1;x++){
                for(int y=0;y<arr.length-x-1;y++){
                        if(arr[y]>arr[y+1]){
                                swap(arr,y,y+1);
                        }
                        }
        }
        return arr;
}


作者: 张占忠    时间: 2012-12-22 10:28
由于,我表达的不够清楚!就是说。第一个程序没有,问题!但是,第二个,加了-X之后,的结果,和第一个,是一样的!
ArrayTool类
public static int[] bubbleSort(int[] arr){
        for (int x=0; x<arr.length-x-1;x++){
                for(int y=0;y<arr.length-x-1;y++){
                        if(arr[y]>arr[y+1]){
                                swap(arr,y,y+1);
                        }
                        }
        }
        return arr;
}

public static void swap(int[]arr,int a,int b){
        int temp=arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
}

ArrayToolDemo类

public static void main(String[] args) {
                int[] arr={70,1,3,32,9};
                ArrayTooy.bubbleSort(arr);
                for(int x:arr){            System.out.println(x);        }

        }

结果:1  3   9  32  70
大家可以试一下,我现在就是想知道,是如何被遍历出来的! 已经蒙了!

作者: 李百韬    时间: 2012-12-22 10:49
99,88,77,66,55,44,33,22,11如果换成这组数据  结果就不对了   这个遍历过程很好理解   
冒泡排序外循环是控制从数组第一个数开始一直到倒数第二个数结束
内循环是控制以外循环选择的数为起点以后向后进一个数 两两比较  知道最后两个数比较
你如果把外循环的中指条件换成Array.length-x-1 如果是五个数的数组70,1,3,32,9相当于  外循环进行了两次也就是第一次循环冒泡得到的数组为1,3,32,9,70
第二次循环得到1,3,9,32,70  所以结果是对的 如果就拿五个数为例  拿一组需要冒泡三次以上的  你的言论就不成立了  比如55,44,33,22,11
第一次循环44,33,22,11,55 第二次循环为33,22,11,44,55 返回结果是这个  还有其实你可以不用返回数组类型  因为是引用数据类型类似于c的指针  不是形参直接操作的就是原地址
最后  谢谢  希望能对你有所帮助  PS:如果循环搞不懂试着在纸上一步一步走  或者用调试工具  很有趣味的
作者: 张占忠    时间: 2012-12-22 10:54
李百韬 发表于 2012-12-22 10:49
99,88,77,66,55,44,33,22,11如果换成这组数据  结果就不对了   这个遍历过程很好理解   
冒泡排序外循环是 ...

感谢的帮助!已经明白了!




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