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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 HM张博文 于 2013-5-27 11:29 编辑
  1. class Sort
  2. {
  3. public static void main(String[] args)
  4. {
  5. int[] arr=new int[]{13,25,6,18,12};
  6. for(int x=0;x<arr.length;x++)
  7. System.out.print(arr[x]+" ");
  8. System.out.println();
  9. for(int x<0;x<arr.length-1;x++)
  10. {
  11. for(int y=x+1;y<arr.length;y++)
  12. {
  13. if(arr[x]>arr[y])
  14. {
  15. swap(arr[x],arr[y]);
  16. }
  17. }
  18. }
  19. for(int x=0;x<arr.length;x++)
  20. System.out.print(arr[x]+" ");
  21. System.out.println();
  22. }
  23. public static void swap(int a,int b)
  24. {
  25. int temp;
  26. temp=a;
  27. a=b;
  28. b=temp;
  29. }
  30. }
复制代码
这个程序输出后并没有按从小到大的顺序排列,为什么?谁能详细说明一下呢?
如果swap(arr[x],arr[y]);改成t=arr[x];arr[x]=arr[y];arr[y]=t;又可以了,为什么定义的交换函数不能完成交换呢?
后来查了下,交换函数写成下面这个就可以完成交换了。但上面那个为什么不行?
public static void swap(int[] arr,int x,int y)
{
  int temp = arr[x];
  arr[x] = arr[y]
;
  arr
[y]= temp;
}

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

11 个回复

倒序浏览
  1. class Sort
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr=new int[]{13,25,6,18,12};
  6.                 for(int x=0;x<arr.length;x++)
  7.                         System.out.print(arr[x]+" ");
  8.                 System.out.println();
  9.                 for(int x<0;x<arr.length-1;x++)
  10.                 {
  11.                         for(int y=x+1;y<arr.length;y++)
  12.                         {
  13.                                 if(arr[x]>arr[y])
  14.                                 {
  15.                                         swap(arr[x],arr[y]);
  16.                                 }
  17.                         }
  18.                 }
  19.                 for(int i=0;i<arr.length;i++)
  20.                         System.out.print(arr+" ");
  21.                 System.out.println();
  22.     }
  23. public static void swap(int a,int b)
  24. {
  25.     int temp;
  26.         temp=a;
  27.         a=b;
  28.         b=temp;
  29. }
  30. }
复制代码
在你的swap里:
public static void swap(int a,int b)       //a和b被定义为局部的,只在此函数里有效
{
    int temp;        
    temp=a;                  //这个交换步骤,简单说就是在自娱自乐
    a=b;                       //swap(arr[x],arr[y])  将arr[x],arr[y]传递给a,b
    b=temp;                 //然后你在该方法里,把a和b的值交换了,而不是arr[x] ,arr[y]的交换。函数执行完a,b没了。而arr[x]  arr[y]没变。
}


希望对你有帮助。{:soso_e181:}

点评

回答很给力  发表于 2013-5-27 10:44
回复 使用道具 举报
其实问题主要在,你确实是进行了交换,但是没有用另外一个数组去保存交换后的结果,所以你交换了等于白交换了,这也就是你下面自己解释的原因。
回复 使用道具 举报
稍微解释一下
因为下面的这个函数只是值的传递,即把值传递到函数里面,值在函数里发生变化
,并不会影响函数外面的数据。除非该函数有返回值
public static void swap(int a,int b)
{
    int temp;
temp=a;
a=b;
b=temp;
}
}
而下面的函数,不但有值的传递,还有地址的传递,形参和实参的地址指向同一个数组这样一个对象。当
在函数里面数组发生改变时,由于和外面是同一个数组,所以数组值会发生改变
所以会出现楼主所说的情况
public static void swap(int[] arr,int x,int y)
{
   int temp = arr[x];
   arr[x] = arr[y];
   arr[y]= temp;
}




回复 使用道具 举报
胡滨 发表于 2013-5-27 10:15
在你的swap里:
public static void swap(int a,int b)       //a和b被定义为局部的,只在此函数里有效
{

请问这位帅哥,你的代码是怎么贴上去的啊?
行号和格式一起贴上去用 的什么技术啊?
能指导我一下么?
回复 使用道具 举报


编辑界面上有个上面那符号哦。代码复制进去就有格式。


希望对你有帮助。{:soso_e181:}

点评

非常感谢版友的热情帮助  发表于 2013-5-27 10:29

评分

参与人数 1黑马币 +3 收起 理由
HM张博文 + 3 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 HM张博文 于 2013-5-27 10:59 编辑
胡滨 发表于 2013-5-27 10:27
编辑界面上有个上面那符号哦。代码复制进去就有格式。








  • 不行啊,怎么我复制进去变成那个样子了呢?














        1. //实验而已
        2. class Sort
        3. {
        4. public static void main(String[] args)
        5. {
        6. int[] arr=new int[]{13,25,6,18,12};
        7. for(int i=0;i<arr.length;i++)
        8. System.out.print(arr[i]+" ");
        9. System.out.println();
        10. for(int i=0;i<arr.length-1;i++)
        11. {
        12. for(int j=i+1;j<arr.length;j++)
        13. {
        14. if(arr[i]>arr[j])
        15. {
        16. int temp;
        17. temp=arr[i];
        18. arr[i]=arr[j];
        19. arr[j]=temp;
        20. }
        21. }
        22. }
        23. for(int i=0;i<arr.length;i++)
        24. System.out.print(arr[i]+" ");
        25. System.out.println();
        26. for(int a:arr)
        27. System.out.print(a);
        28. }

        29. }
        复制代码

回复 使用道具 举报
胡滨 中级黑马 2013-5-27 10:51:02
8#


先这样,然后点提交↑↑↑


然后就会到编辑窗口↓↓↓

点评

感谢这位师兄耐心的指导,可是这样复制进去,好像代码都是顶格的?  发表于 2013-5-27 11:20
回复 使用道具 举报
没有赶上哈
回复 使用道具 举报
本帖最后由 王瀛 于 2013-5-27 11:10 编辑
  1. class Sort
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr = new int[]{90,46,57,31,48,70};//定义整形实例化数组(乱序)
  6.                 System.out.print("排序前的数组为:");
  7.                 printArray(arr);//排序前打印
  8.                 selectSort(arr);//调用选择排序
  9.                 System.out.print("排序后的数组为:");
  10.                 printArray(arr);//排序后打印
  11.         }
  12.        
  13.         private static void swap(int[] arr,int a,int b)//"换位置"方法,这里定义传入参数是局部变量,局部变量随着方法的调用,而在栈内存中分配空间,一旦方法调用结束,局部变量就被释放。如果仅定义int ah和int b,相当于两个数在内存中换了下位置,然后又消失了,与你想要进行的数组中元素的交换没有任何联系。所以这里除了要定义a,b外,还需要定义数组
  14.         {       
  15.                 int temp;//定义临时存储的"格子"
  16.                 temp = arr[a];
  17.                 arr[a] = arr[b];
  18.                 arr[b] = temp;
  19.         }

  20.         private static void printArray(int arr[])//遍历数组方法
  21.         {
  22.                 System.out.print("[");
  23.                 for (int x=0;x<arr.length ;x++ )
  24.                 {
  25.                         if (x!=arr.length-1)
  26.                                 System.out.print(arr[x]+",");
  27.                         else
  28.                                 System.out.println(arr[x]+"]");
  29.                 }
  30.         }

  31.         public static void selectSort(int[] arr)//选择排序法
  32.         {
  33.                 for (int x=0;x<arr.length-1 ;x++ )//防止角标越界,所以是arr.length-1
  34.                 {
  35.                         for (int y=x+1;y<arr.length ;y++ )
  36.                         {
  37.                                 if (arr[x]>arr[y])
  38.                                 {
  39.                                         swap(arr,x,y);
  40.                                 }
  41.                         }
  42.                 }
  43.         }
  44. }
复制代码
解释在注释中了

评分

参与人数 1黑马币 +3 收起 理由
HM张博文 + 3 赞一个!

查看全部评分

回复 使用道具 举报
胡滨 发表于 2013-5-27 10:51
先这样,然后点提交↑↑↑

行号问题我会了,刚才没有复制进去
但现在的问题是行号有了,但每行代码都是顶格的,复制前不是这样的
回复 使用道具 举报
HM张博文 发表于 2013-5-27 11:12
行号问题我会了,刚才没有复制进去
但现在的问题是行号有了,但每行代码都是顶格的,复制前不是这样的 ...

应该是你复制前就不是标准格式,不规范。用editplus或eclipse编写格式比较好看。
  1. class Sort

  2. {

  3.         public static void main(String[] args)
  4.         {

  5.                 int[] arr=new int[]{13,25,6,18,12};

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

  7.                         System.out.print(arr[x]+" ");

  8.                 System.out.println();

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

  10.                 {

  11.                         for(int y=x+1;y<arr.length;y++)

  12.                         {

  13.                                 if(arr[x]>arr[y])

  14.                                 {

  15.                                         swap(arr[x],arr[y]);

  16.                                 }

  17.                         }

  18.                 }

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

  20.                         System.out.print(arr+" ");

  21.                 System.out.println();

  22.     }

  23. public static void swap(int a,int b)

  24. {

  25.     int temp;

  26.         temp=a;

  27.         a=b;

  28.         b=temp;

  29. }
  30. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马