public class SortUtil
{

public static void main(String args[]) {
int [] arr = new int[]{11,65,23,58,72,67,95,56,33};  //(2)
SortUtil st = new SortUtil();
st.selectionSort(arr); 
System.out.println("选择排序为:"); 
System.out.println(Arrays.toString(arr)); //(1)
        }

private void swap(int [] arr,int i,int j) {
int temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}

public int [] selectionSort(int[] arr) {
for(int i=0;i<arr.length;i++) {
for(int j=i+1;j<arr.length;j++) {
if(arr[i] < arr[j]) {
swap(arr,i,j);
}
}
}
return arr;
}
//为什么(1)这里的arr已经排序好了呢,方法selectionSort()不是只变更了局部的arr么,返回的arr还没获取这里已经变了...其实我要问的就是上面(2)处声明的arr数组的作用域..;另外怎样才可以变成局部的?

解决方案 »

  1.   

    基本数据类型值的副本,Obj类型内存地址..另外再问一下,该怎么办,后面还有一些排序算法,难道要再次new()数组么?我想一起测试并打印出来,因为第一个算法已经弄好了顺序,所以...后面的测试不了..
      

  2.   

    因为每次传进去的arr是数组的地址,所以对局部变量做的改变就是对对象做改变改变局部变量?想怎么改就怎么改啊,一调用完函数,局部变量就没有了你可以用Collections.shuffle(Arrays.asList(arr));打乱顺便再用后面的排序方法排序
      

  3.   

    //为什么(1)这里的arr已经排序好了呢,方法selectionSort()不是只变更了局部的arr么,返回的arr还没获取这里已经变了答:执行完st.selectionSort(arr); arr就已经排序好了,把arr数组的引用传递进去了,对arr里的内容已经排序了,所以(1)出已经有序
        (2)处的作用域除就是main方法的那个{}内部,但在执行main的时候,调用selectionSort方法时会临时保存现场去调用该函数,待调用返回后,在回到刚刚保存的现场继续执行,其实楼主问的问题跟作用域没有关系呀?
      

  4.   

    副本引用同样指向 arr 地址。
      栈地址      堆内存
       arr  -----> {11,65,23,58,72,67,95,56,33}  //main函数中arr
                      ^          ^
                      |          |
       arr  ----------           |                             //selectionSort方法中的 arr
       arr  ---------------------                              //swap  方法中的 arr楼主理解了吗?
       
      

  5.   

    import java.util.Arrays;public class SortUtil
    {
        
        public static void main(String args[]) {
            int [] arr = new int[]{11,65,23,58,72,67,95,56,33};  //(2)
            System.out.println(arr);
            SortUtil st = new SortUtil();        
            st.selectionSort(arr); 
            System.out.println("选择排序为:"); 
            System.out.println(Arrays.toString(arr)); //(1)
            }    
        
        private void swap(int [] arr,int i,int j) {        
           System.out.println(arr);
            int temp = arr[i];
            arr[i]=arr[j];
            arr[j]=temp;                
        }    
        
        public int [] selectionSort(int[] arr) {
           System.out.println(arr);
            for(int i=0;i<arr.length;i++) {
                for(int j=i+1;j<arr.length;j++) {
                    if(arr[i] < arr[j]) {
                        swap(arr,i,j);
                    }
                }
            }
            return arr;        
        }
    }看看地址,是一样的。