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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM张博文 高级黑马   /  2013-5-21 03:53  /  1616 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Sort
{
public static void main(String[] args)
{
  int[] arr=new int[]{13,25,6,18,12};
  for(int i=0;i<arr.length;i++)
  System.out.print(arr[i]+" ");
  System.out.println();
  for(int i=0;i<arr.length-1;i++)
  {
   for(int j=1;j<arr.length;j++)
   {
    if(arr[i]>arr[j])
    {
     int temp;
     temp=arr[i];
     arr[i]=arr[j];
     arr[j]=temp;
    }
   }
  }
  for(int i=0;i<arr.length;i++)
  System.out.print(arr[i]+" ");
  System.out.println();
  System.out.println(arr);
}
}
输出结果
①为什么不是从小到大的顺序排列的?
②最后一行用System.out.println(arr);为什么不能打印整个数组,打印出来的是一串字母,怪哉啊

输出结果2.jpg (5.21 KB, 下载次数: 0)

输出结果

输出结果

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 这个问题他们没看见

查看全部评分

10 个回复

倒序浏览
数据相当于是一个容器。

想要得到每个元素肯定都是需要遍历的

比如你的这个数组:    int[] arr=new int[]{13,25,6,18,12};

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

   for(int j=1;j<arr.length;j++)   //没有完成你想要的排序是这里比较的方式有问题


13   25  6  18  12

第一遍比较:
   13和25    不需要交换
   再比较13 和 6  需要交换  这个时候数组就进行了更新变成了
       6  25 13 18 12
   再比较6和18不需要交换
   接着比较6和12 不需要交换。这样第一次比较就结束了。

你看这样得到的第一个数一定是最小的数。所以第二轮比较久不需要再从同开始了
第二轮比较:
   先比较25和13,需要交换,得到新的数组

    6 13 25 18 12
  在比较13 和18 不需要交换
  再比较13和12,需要交换,得到新的数组

    6 12  25 18 13

这样应该就可以看懂了吧。

那么实现方式就应该是

for(int i=0;i<arr.lenth-1;i++){
  for(int j =i+1;j<arr.lenth;j++)
{
......
}
}


那么想要得到数组中的每个元素,也是需要遍历的

for(int a: arr){
System.out.println(a);
}

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
你的嵌套循环有问题的  ,前后辆次都要实现遍历的
回复 使用道具 举报
Super_Class 发表于 2013-5-21 07:30
数据相当于是一个容器。

想要得到每个元素肯定都是需要遍历的

for(int a:arr)是个什么意思啊?
回复 使用道具 举报
jdk新特性  等价于for(int a=0;a<arr.length;a++)
回复 使用道具 举报
我把你的代码进行改装了一下,你看看:
class Sort
{
//对打印数组的方法进行封装
public static void printArr(int arr[])
{
      System.out.print("[");
        for(int i=0;i<arr.length;i++)
          {
           if(i!=arr.length-1)
            {
             System.out.print(arr[i]+",");
            }
            
          }
        System.out.println(arr[arr.length-1]+"]");
}
//对数组进行排序
public static void SortArr(int arr[])
{
    int temp=0;  
      for(int i=0;i<arr.length-1;i++)
       {       //循环第一次 就是比较第一个数与剩下的数 如果第一个数大 则交换      
          for(int j=i+1;j<arr.length;j++)
            {   
             if(arr[i]>arr[j])
               {      
                 temp=arr[i];
                 arr[i]=arr[j];
                 arr[j]=temp;   
                }   
          }
      }
  }
  public static void main(String args[])
     {
        int[] arr={13,25,6,18,12};
      //打印排序前的数组
       printArr(arr);
       //调用数组的排序方法
       SortArr(arr);
       //打印排序后的数组
       printArr(arr);
      }  
}
回复 使用道具 举报
你的程序得不到从小到大排序的数组是因为你的内部for循环定义有错,你的for循环是:
for(int i=0;i<arr.length-1;i++)
  {
   for(int j=1;j<arr.length;j++)
   {
    if(arr[i]>arr[j])
    {
     int temp;
     temp=arr[i];
     arr[i]=arr[j];
     arr[j]=temp;
    }
   }
  }
意味着你每取一个值,都要从1角标位开始比,然后根据大小关系交换位置,这样就会造成混乱。
如果按照你的循环来比较换位的话,具体情况是这样的:
i=0时,arr[0]与a[1]——a[4]逐个比较换位,结果是 6,25,13,18,12
i=1时,arr[1]与a[1]——a[4]逐个比较换位,结果是 6,12,25,18,13
i=2时,arr[2]与a[1]——a[4]逐个比较换位,结果是 6,25,12,18,13
i=3时,arr[3]与a[1]——a[4]逐个比较换位,结果是 6,25,18,12,13   所以与你得出的结果吻合。
至于你说的System.out.println(arr);其实它的含义是打印出数组第一个值的地址值。
按照你的思路,程序只要稍作修改就OK了,如下:
class Sort
{
public static void main(String[] args)
{
  int[] arr=new int[]{13,25,6,18,12};
  for(int i=0;i<arr.length;i++)
  System.out.print(arr[i]+" ");
  System.out.println();
  for(int i=0;i<arr.length-1;i++)
  {
   for(int j=i+1;j<arr.length;j++)
   {
    if(arr[i]>arr[j])
    {
     int temp;
     temp=arr[i];
     arr[i]=arr[j];
     arr[j]=temp;
    }
   }
  }
  for(int i=0;i<arr.length;i++)
  System.out.print(arr[i]+" ");
  System.out.println();
}
}
把内层for循环j的初始化值改成j=i+1就行了,这样就是和每一次取值后面的几个值进行比较就行了,其实这就是选择排序法的原理,
建议你写程序的时候把排序独立封装成一个函数更好,可以提高复用性,看起来也更清晰。

回复 使用道具 举报
HM张博文 发表于 2013-5-21 19:16
for(int a:arr)是个什么意思啊?

foreach语句,就是高级for循环
回复 使用道具 举报
一串字母打印的是数组的哈希值,就是地址值。打印数组不能那样打印的。你可以看下视频里老师的代码
回复 使用道具 举报
打印数组是需要遍历的,如下:
for(int i=0;i<arr.length;i++)
System.out.print(arr[i]);
还有,你的排序算法有问题,排序的核心代码如下
public static int[] bubbleSort(int[] args){//冒泡排序算法
                 for(int i=0;i<args.length-1;i++){
                         for(int j=i+1;j<args.length;j++){
                                 if (args[i]>args[j]){
                                         int temp=args[i];
                                         args[i]=args[j];
                                         args[j]=temp;
                                 }
                         }
                 }
                 return args;
         }
回复 使用道具 举报
for(int j=1;j<arr.length;j++)代表你每次进行比较的时候都是从a[1]开始比较的,
第一次循环a[0]开始于a[1]比较,结果: 6,25,13,18,12,这没错,
但是第二次循环a[1]又从a[1]开始往后比较,结果: 6,12,25,18,13,
第三次循环a[2]又从a[1]开始往后比较,注意就是这里开始出的问题..a[2]=25,a[1]=12,if a[2]>a[1]  这时条件满足,25和12调换位置,这时25跑到左边第二个位置去了,然后,以后面第四轮,第五轮,都是从a[1]开始比,而且,后面没有任何数比25,也就没有任何数能和25换位子,25也就永远在第二位。同样道理,18也跑前面去了!  这时循环又结束了!

你要把内层for循环j的初始化值改成j=i+1就行了,这样就是和每一次取值后面的几个值进行比较就行了。


至于你的第二个问题,System.out.println(arr) 打印出的其实是数组在对内存中的地址,要输出数组值,必须遍历数组!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马