黑马程序员技术交流社区

标题: 一个简单的排序问题。。。 [打印本页]

作者: 黑马巩伟伟    时间: 2011-12-25 21:01
标题: 一个简单的排序问题。。。
本帖最后由 黑马巩伟伟 于 2011-12-25 22:02 编辑

public static void method_3()
        {
             int[] arr={1,2,5,7,9,4,11};
             int temp=0;
                 System.out.println("Before sorting is: ");
                 
           for(int i=0;i<arr.length;i++)
           {
                   System.out.print(arr+"   ");//为什么我在这里的输出结果全是1?有一次是把arr的值全打印出来了,可是之后再编译打印的时候就全部是1了,求解!!
              for(int j=i+1;j<arr.length;j++)
                   {
                     
                           if(arr<arr[j])
                           {
                              temp=arr;
                                  arr=arr[j];
                                  arr[j]=temp;
                           }
                  }
           }
           System.out.println();
           System.out.println("After sorted is:  ");
           for(int i=0;i<arr.length;i++)
                {
               System.out.print(arr+"   ");
           }
作者: 王冀    时间: 2011-12-25 21:05
本帖最后由 王冀 于 2011-12-25 21:08 编辑

你是想在排序之前打印一次?

那么应该把
           for(int i=0;i<arr.length;i++)
                {
               System.out.print(arr+"   ");
           }
在排序前写一次,不能同时打印和排序


public static void method_3()
        {
             int[] arr={1,2,5,7,9,4,11};
             int temp=0;
                 System.out.println("Before sorting is: ");
          for(int i=0;i<arr.length;i++)
           {
               System.out.print(arr+"   ");
           }               
           for(int i=0;i<arr.length;i++)
           {
                   //////////////////////System.out.print(arr+"   ");
              for(int j=i+1;j<arr.length;j++)
                   {
                     
                           if(arr<arr[j])
                           {
                              temp=arr;
                                  arr=arr[j];
                                  arr[j]=temp;
                           }
                  }
           }
           System.out.println();
           System.out.println("After sorted is:  ");
           for(int i=0;i<arr.length;i++)
                {
               System.out.print(arr+"   ");
           }
}
作者: 黑马巩伟伟    时间: 2011-12-25 21:09
王冀 发表于 2011-12-25 21:05
你是想在排序之前打印一次?

那么应该把

我是想知道为什么同时进行的时间为什么会出现这样的结果? 如果能把运行的过程说说的话最好啦。。:)
作者: 李楠    时间: 2011-12-25 21:50
Before sorting is:
1   1   1   1   1   1   1   
After sorted is:  
11   9   7   5   4   2   1  
这是结果吧?
第一个1,是你序列的第一个。
然后数组的第一个arr[0]和第二个arr[1]比,2比1大,换位,现在1到了第二位arr[1].
然后外层循环i+1,又打印arr[1],还是1,依次类推,就一直是1.
但是,一直是1只是因为你的第一个是这个序列最小的一个,所以1在一直被往后退,就一直打印1了。
你换一个字符序列,打印结果就不一样了。
作者: 李楠    时间: 2011-12-25 21:59
如果你想查看排序过程:
  for(int i=0;i<arr.length;i++)
           {
                for(int k:arr){
                  System.out.print(k+"   ");//这里加一个for循环,全部输出。
                     }
                    System.out.println();

                //   System.out.print(arr[i]+"   ");//为什么我在这里的输出结果全是1?有一次是把arr的值全打印出来了,可是之后再编译打印的时候就全部是1了,求解!!
              for(int j=i+1;j<arr.length;j++)
                   {
                     
                           if(arr[i]<arr[j])
                           {
                              temp=arr[i];
                                  arr[i]=arr[j];
                                  arr[j]=temp;
                           }
                  }
           }

给你看一下结果,你就知道为什么一直输出1了。
Before sorting is:
1   2   5   7   9   4   11   
11   1   2   5   7   4   9   
11   9   1   2   5   4   7   
11   9   7   1   2   4   5   
11   9   7   5   1   2   4   
11   9   7   5   4   1   2   
11   9   7   5   4   2   1   

After sorted is:  
11   9   7   5   4   2   1  
你看1的位置、
作者: 刘忠德    时间: 2011-12-25 21:59
  在执行System.out.print(arr[i]+"   ");时其实你的数组已经被改变了,你输出的数是arr[i]和arr[i-1]中较小的值,因为在内循环进行比较的时候如果arr[i-1]比arr[i]小的话,你就将这两个值进行了交换,而输出的是arr[i-1+1],即arr[i],不知道我这样说,你能看懂吗?
作者: 黑马巩伟伟    时间: 2011-12-25 22:00
李楠 发表于 2011-12-25 21:50
Before sorting is:
1   1   1   1   1   1   1   
After sorted is:  

老兄我明白了,因为我是从大到小排序的,而这个数组里恰恰1是最小的,它总是往后移。也就是说i+1后1同时也向后移了一位,自然取到的就一直是它了。    噢了!!  
作者: 黑马巩伟伟    时间: 2011-12-25 22:04
李楠 发表于 2011-12-25 21:59
如果你想查看排序过程:
  for(int i=0;i

嗯  问题就出在这里了,因为我从大到小排的,而1恰恰是最小的。明白了。。。。。谢谢,你的答案很明确
作者: 黑马巩伟伟    时间: 2011-12-25 22:06
刘忠德 发表于 2011-12-25 21:59
在执行System.out.print(arr+"   ");时其实你的数组已经被改变了,你输出的数是arr和arr中较小的值,因为 ...

你的意思我理解了,非常感谢!!!
作者: 肖岑锋    时间: 2011-12-25 22:26
原理说来很简单的。
当外循环i = 0时,内循环排序后数组为11  1  2  5  7  9
当外循环i = 1时,内循环排序后数组为11  9  1  2  5  7
当外循环i = 2时,内循环排序后数组为11  9  7  1  2  5
当外循环i = 3时,内循环排序后数组为11  9  7  5  1  2
当外循环i = 4时,内循环排序后数组为11  9  7  5  2  1

你输出的话,当然全部都是1了。。。。
作者: 刘小峰    时间: 2011-12-26 21:19
顶一下上面的额




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