黑马程序员技术交流社区

标题: 来找错误喽! [打印本页]

作者: 夕颜    时间: 2015-4-17 22:06
标题: 来找错误喽!
对一个数组进行选择排序,我自己写了一个方法,再加上了老师的一个方法,并将排序结果打印出来,两次的结果不一样。ps:分别指用一个方法都是正确的,为什么两个方法一起就是错的呢?代码如下:class ArrayPaiXu
{
/*{5,1,6,4,2,8,9}排序并输出*
分析:
     1、该功能没有返回值;
     2、不需要未知内容参与;
*/
    public static void selectSort(int[] arr)
    {
        int[] myArray = new int[arr.length];
        int num =0;

        for(int i=0;i<arr.length;i++)
        {
              int min = arr[i];
                    for(int j=i;j<arr.length;j++)
                    {
                    if(arr[j]<min)
                    {
                              num = arr[j];
                              arr[j] = min;
                              min = num;
                    }
                    }
                    myArray[i] = min;
        }
        for(int i=0;i<arr.length;i++)
        {
            System.out.print(myArray[i]);
        }
    }
    //老师的方法
    public static void selectSortT(int[] arr)
    {
             //int num = arr[0],num1 = 0;
             
       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 = arr[i];
                                     arr[i] = arr[j];
                                     arr[j] = temp;
                                     
                           }       
                        
                   }

       }       
       for(int i=0;i<arr.length;i++)
       {
           System.out.print(arr[i]);       
       }

    }
    public static void main(String[] args)
    {
        int[] arr = {5,1,6,4,2,8,9};
        selectSort(arr);
        System.out.println();
        selectSortT(arr);

    }
}


作者: 王善辉    时间: 2015-4-17 22:17
arr.length,你有定义arr吗?
作者: 夕颜    时间: 2015-4-17 22:35
王善辉 发表于 2015-4-17 22:17
arr.length,你有定义arr吗?

定义了 子啊主函数main里面
作者: 夕颜    时间: 2015-4-17 22:37
补充说明一下,数组在内存的存储方式有关
作者: lai19    时间: 2015-4-17 22:41
数组都没定义
作者: 关山明月    时间: 2015-4-17 22:56
你自己的方法有问题,因为你每次两个元素比较的时候,将值小的元素赋给min,然后将较小的值赋给的是myArray[i] ,而实际上,应该存入的是arr[i]中。而且你打印的是myArray这个数组。可以在内循环外加上一句:arr[i]=min;然后就OK了
作者: 夕颜    时间: 2015-4-17 23:12
lai19 发表于 2015-4-17 22:41
数组都没定义

数组定义在主函数main里面
作者: 夕颜    时间: 2015-4-17 23:13
关山明月 发表于 2015-4-17 22:56
你自己的方法有问题,因为你每次两个元素比较的时候,将值小的元素赋给min,然后将较小的值赋给的是myArray ...

在内循环for结束的时候我把min值赋值给了myArray数组,可以赋值代码编译执行看看
作者: Dylon    时间: 2015-4-17 23:42
在你的方法里把排序后的数据放在myArray[]里面了 ,而且还把数组arr[]的内部值改变了,像楼上说的在第一层的for循环里面加上arr[i] = min; 就好了。
for(int i=0;i<arr.length;i++)
        {
              int min = arr[i];
                    for(int j=i;j<arr.length;j++)
                    {
                    if(arr[j]<min)
                    {
                              num = arr[j];
                              arr[j] = min;
                              min = num;
                    }
                    }
                    myArray[i] = min;
                    arr[i] = min;
        }
作者: 关山明月    时间: 2015-4-17 23:55
夕颜 发表于 2015-4-17 23:13
在内循环for结束的时候我把min值赋值给了myArray数组,可以赋值代码编译执行看看 ...

是的,但是你最终是要给arr这个数组排序呀,所以要将排序后的结果存入arr中,你的方法里,是将排序后的结果存入到了myArray里,而arr这个数组里每一轮比较后,并没有将每一轮的最小值分别存到arr数组里。你可以在你自己的方法里将arr数组中的元素打印出来看一下。你会发现arr数组中的元素和arr原来的元素不一样。所以用老师排序的结果和你的不同,因为数组是引用类型,你在你的方法中将arr中的元素改变了,用老师的方法排的是改变后的数组顺序。。。

作者: liurongzhi1991    时间: 2015-4-17 23:56
咳咳咳·············
作者: q8893616    时间: 2015-4-18 00:10
楼上正解  
这样输出一下你就知道了    你的arr[]里面存的一直都是较大的数之后排序结束你也没把排序完成的元素重新赋值给arr[]
public static void selectSort(int[] arr)
{
    int[] myArray = new int[arr.length];
    int num =0;

    for(int i=0;i<arr.length;i++)
    {
          int min = arr[i];
                for(int j=i;j<arr.length;j++)
                {
                if(arr[j]<min)
                {
                          num = arr[j];
                          arr[j] = min;
                          min = num;
                }
                }
                myArray[i] = min;
    }
    for(int i=0;i<arr.length;i++)
    {
        System.out.print(myArray[i]);
    }
    System.out.println();
    for(int i=0;i<arr.length;i++)
    {
        System.out.print(arr[i]);
    }
}
public static void main(String[] args)
{
    int[] arr = {5,1,6,4,2,8,9};
    selectSort(arr);
}
作者: 夕颜    时间: 2015-4-18 00:17
q8893616 发表于 2015-4-18 00:10
楼上正解  
这样输出一下你就知道了    你的arr[]里面存的一直都是较大的数之后排序结束你也没把排序完成的 ...

嗯嗯,是的,第一个方法  我把结果给了另一个数组
作者: 夕颜    时间: 2015-4-18 00:18
关山明月 发表于 2015-4-17 23:55
是的,但是你最终是要给arr这个数组排序呀,所以要将排序后的结果存入arr中,你的方法里,是将排序后的结 ...

嗯嗯 是的  第一次看到这样的结果  吓到我了
作者: 夕颜    时间: 2015-4-18 00:20
Dylon 发表于 2015-4-17 23:42
在你的方法里把排序后的数据放在myArray[]里面了 ,而且还把数组arr[]的内部值改变了,像楼上说的在第一层 ...

嗯嗯  的确是如此  这个还真没想到  长见识了
作者: ulddfhv    时间: 2015-4-18 00:43
我就喜欢看大家讨论,强势围观
作者: 夕颜    时间: 2015-4-18 00:48
ulddfhv 发表于 2015-4-18 00:43
我就喜欢看大家讨论,强势围观

笑而不语是吗
作者: ulddfhv    时间: 2015-4-18 01:00
哪里,我就是来跟美女聊聊人生的。




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