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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 20140829 中级黑马   /  2014-10-18 19:43  /  6383 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class A5 {
  2.         public static void main(String[] args) {
  3.                 int[] arr = { 1, 5, 2, 6, 3 };
  4.                 for (int i = 0; i < arr.length; i++) {
  5.                         for (int j = 0; j < arr.length-i-1; j++) {
  6.                                 if (arr[j]>arr[j+1]) {
  7.                                         int temp=arr[j];
  8.                                         arr[j]=arr[j+1];
  9.                                         arr[j+1]=temp;
  10.                                 }
  11.                         }
  12.                         System.out.print(arr[i]);
  13.                 }

  14.         }
  15. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

10 个回复

正序浏览
韶山 高级黑马 2014-10-19 16:59:33
11#
减少判断次数,防止越界
回复 使用道具 举报
inception 发表于 2014-10-19 14:28
减1就不说了,减x是后面已经排好序的数,不用在进行比较了。x外循环,循环1次,内循环就少比较1次,循环x次 ...

额,原来如此,多谢
回复 使用道具 举报
inception 来自手机 中级黑马 2014-10-19 14:28:36
9#
减1就不说了,减x是后面已经排好序的数,不用在进行比较了。x外循环,循环1次,内循环就少比较1次,循环x次就少比较x次。所以减x。   没有减x也是对的,就是后面已排序的数还进行比较,多余的比较而已
回复 使用道具 举报
如果你不减1的话  运行到最后会角标越界。因为进行比较的是y 与y+1;
回复 使用道具 举报
cxdzh 发表于 2014-10-18 20:19
class A5 {
        public static void main(String[] args) {
                int[] arr = { 1, 5, 2, 6 ...

谢谢你的解释
回复 使用道具 举报
回复 使用道具 举报
D.reamJA 发表于 2014-10-18 20:19
建议第一个for语句也-1。因为最后一个数不需要比较,可以提高点效率。第二个for语句-1是因为后面有个j+1.这 ...

额,那为什么还要减x呢?
回复 使用道具 举报
本帖最后由 D.reamJA 于 2014-10-18 20:24 编辑

建议第一个for语句也-1。因为最后一个数不需要比较,可以提高点效率。第二个for语句-1是因为后面有个j+1.这样就不会越界了
回复 使用道具 举报
class A5 {
        public static void main(String[] args) {
                int[] arr = { 1, 5, 2, 6, 3 };
                for (int i = 0; i < arr.length; i++) {
                         //内循环j<arr.length-i-1,,,
                       //减1是因为下面会判断arr[j+1],防止下标越界,,这样相当于循环判断条件是j+1<arr.length
                       //减i是因为每循环一次,都可以少判断一个数,
                       //比如每比较一次都把大的数往后换位,那么第一轮循环完,数组的最后一个位置上肯定是最大的数,下一轮就不用再比较它,内循环就可以少循环一次.,这个次数就是用-i来控制
                        for (int j = 0; j < arr.length-i-1; j++) {
                                if (arr[j]>arr[j+1]) {
                                        int temp=arr[j];
                                        arr[j]=arr[j+1];
                                        arr[j+1]=temp;
                                }
                        }
                        System.out.print(arr[i]);
                }

        }
}

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
  1. class A5
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr = { 1, 5, 2, 6, 3 };
  6.                 for (int i = 0; i < arr.length; i++)
  7.                 {
  8.                         for (int j = 0; j < arr.length - i - 1; j++)
  9.                         {
  10.                                 if (arr[j] > arr[j + 1]) // 如果不减1, i = 0的时候, j 最大值能取 arr.length-1,
  11.                                 {                        // if (arr[j] > arr[j + 1]) 这里的 arr[j+1] 加1之后 角标 =arr.length ; 角标越界,出错
  12.                                         int temp = arr[j];
  13.                                         arr[j] = arr[j + 1];
  14.                                         arr[j + 1] = temp;
  15.                                 }
  16.                         }
  17.                         System.out.print(arr[i]);
  18.                 }
  19.         }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

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