黑马程序员技术交流社区

标题: 数组排序这样为什么不行? [打印本页]

作者: 想飞的鱼    时间: 2014-5-4 21:06
标题: 数组排序这样为什么不行?
  1. //求高手解答,为什么排序没成功?
  2. class Test
  3. {
  4.         public static void swap(int [] arr,int x,int y)
  5.         {
  6.                 int temp = x;
  7.                 x = y;
  8.                 y = temp;
  9.         }
  10.         public static void searchSort(int[] arr)
  11.         {
  12.                 for (int x=0;x<arr.length-1 ;x++ )//-1防止越界,y=x+1
  13.                 {
  14.                         for (int y=x+1;y<arr.length ;y++ )
  15.                         {
  16.                                 if (arr[x]>arr[y])
  17.                                 {
  18.                                         swap(arr,arr[x],arr[y]);//交换位置
  19.                                 }
  20.                         }
  21.                 }
  22.         }
  23.         public static void printArray(int[] arr)
  24.         {
  25.                 System.out.print("[");
  26.                 for (int x=0;x<arr.length;x++)
  27.                 {
  28.                         if (x!=arr.length-1)
  29.                                 System.out.print(arr[x]+", ");
  30.                         else
  31.                                 System.out.println(arr[x]+"]");
  32.                 }
  33.         }
  34.         public static void main(String[] args)
  35.         {
  36.                 int[] arr = {1,5,7,2,6,3,9};
  37.                 printArray(arr);
  38.                 searchSort(arr);
  39.                 printArray(arr);
  40.         }
  41. }
复制代码



作者: Lin0411    时间: 2014-5-4 21:29
swap函数写错了,应该是这样。
        public static void swap(int [] arr,int x,int y)
        {
                int temp = arr[x];
                arr[x] = arr[y];
                arr[y] = temp;
        }
作者: 想飞的鱼    时间: 2014-5-4 21:34
Lin0411 发表于 2014-5-4 21:29
swap函数写错了,应该是这样。
        public static void swap(int [] arr,int x,int y)
        {

嗯 我发现了,可就是不知道我那样写为什么不行呢?编译运行都通过,传arr[x],arr[y]到swap也符合参数类型的啊
作者: Lin0411    时间: 2014-5-4 21:38
先说一个例子:
public static void swap(int x,int y)
{
     int temp = x;

}
作者: z1342802487    时间: 2014-5-4 21:40
可以看出来是swap方法出问题了。
下面看一下Java方法中参数传递方式,java中没有指针,所以也没有引用传递了,仅仅有值传递 ,不过可以通过对象的方式来实现引用传递。
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
你写的swap方法就是值传递,在方法内交换的只是形参,实参没有变。如:
public   class  Test {   
            
     public   static   void  swap( int  i,  int  j) {   
         int  temp = i;   
        i = j;   
        j = temp;   
    }   
  
     public   static   void  main(String[] args) {   
         int  a =  3 ;   
         int  b =  4 ;   
        change(a, b);   
  
        System.out.println( "a="  + a);   
        System.out.println( "b="  + b);   
    }   
}
结果为:   
a= 3   
b= 4   
原因就是 参数中传递的是 基本类型 a 和 b 的拷贝,在函数中交换的也是那份拷贝的值 而不是数据本身;
对于你的程序把swap方法改了就行了
  1. public static void swap(int[] arr, int x, int y)
  2.                         {
  3.                                 //int temp = arr[x];
  4.                                 //arr[x] = arr[y];
  5.                                 //arr[y] = temp;
  6.                                 arr[x]=arr[x]^arr[y];
  7.                                 arr[y]=arr[x]^arr[y];
  8.                                 arr[x]=arr[x]^arr[y];
  9.                         }
复制代码

也可以把下面三句注释掉,用上面那三句。功能都一样,只不过上面的更容易看懂。
作者: Lin0411    时间: 2014-5-4 21:45

先说一个例子:
public static void swap(int x,int y)
{
     int temp = x;
     x = y;
    y = temp;
}

public static void main(String[] args)
{
      int[] arr = {1,2,3,4};

     swap(arr[0],arr[1]);
     for(int i: arr)
    {
         System.out.pritln(i);
    }
}

输出的仍是1,2,3,4并没有对1和2进行交换。主要原因是函数中参数的传递时单向的,只能有实参传给形参,也就是说虽然在swap函数中x和y的值交换了,但它们无法再往回传给传过来的实参,因此要想交换数组中的元素,必须还要传递数组的引用进来,也即存放数组元素的地址,这样才能真正地交换存储在这个首地址中的的数组中的元素!!
作者: 来男.    时间: 2014-5-4 21:49
class Test
{
        public static void swap(int [] arr,int x,int y)
        {
                int temp = arr[x];---------------------------------------------------------------1
                arr[x] = arr[y];-------------------------------------------------------------------1
                arr[y] = temp;-------------------------------------------------------------------1
        }
        public static void searchSort(int[] arr)
        {
                for (int x=0;x<arr.length-1 ;x++ )//-1防止越界,y=x+1
                {
                        for (int y=x+1;y<arr.length ;y++ )
                        {
                                if (arr[x]>arr[y])
                                {
                                        swap(arr,x,y);//交换位置----------------------------------------2
                                }
                        }
                }
        }

        public static void printArray(int[] arr)
        {
                System.out.print("[");
                for (int x=0;x<arr.length;x++)
                {
                        if (x!=arr.length-1)
                                System.out.print(arr[x]+", ");
                        else
                                System.out.println(arr[x]+"]");
                }
        }
        public static void main(String[] args)
        {
                int[] arr = {1,5,7,2,6,3,9};
                printArray(arr);
                searchSort(arr);
                printArray(arr);
        }
}

同学:你上面出了两问题。
1、上面的问题(1)是应将x,y作为角标传到arr数组中,进行值比较,但你没用arr;
2、下面的问题(2)是应将x,y (也就是角标)作为参数,而不是具体的值,比如arr[x],arr[y]。


作者: 想飞的鱼    时间: 2014-5-4 21:53
z1342802487 发表于 2014-5-4 21:40
可以看出来是swap方法出问题了。
下面看一下Java方法中参数传递方式,java中没有指针,所以也没有引用传递 ...

哦哦,看了好大一会才搞明白了,谢谢啦!
作者: 想飞的鱼    时间: 2014-5-4 21:57
Lin0411 发表于 2014-5-4 21:45
先说一个例子:
public static void swap(int x,int y)
{

嗯,问题解决了,谢啦,但是你这段代码,for那句我没看懂,而且输出数组也可以这样输出啊?
作者: Lin0411    时间: 2014-5-4 22:52
想飞的鱼 发表于 2014-5-4 21:57
嗯,问题解决了,谢啦,但是你这段代码,for那句我没看懂,而且输出数组也可以这样输出啊? ...

就是:
for(int i=0; i<arr.length; i++)
{
    s.o.p(i);
}




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