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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘腾 于 2012-11-11 23:04 编辑
  1. //对数组{2,345,111,1,34,5}的选择排序
  2. class Select
  3. {
  4.    public static void main(String[] args)
  5.            {
  6.                  int[] arr={2,345,111,1,34,5};
  7.                  selectSort(arr);
  8.                  System.out.println("排序后的数组为:");
  9.                  printarr(arr);
  10.            }
  11.    public static void selectSort(int[] arr)
  12.     {
  13.          int temp=0;
  14.          int min=0;
  15.          for(int i=0;i<arr.length-1;i++)
  16.                 {
  17.               min=i;
  18.               for(int j=i+1;j<arr.length;j++)
  19.                          {
  20.                            if(arr[i]>arr[j])
  21.                            min=j;
  22.                         }
  23.               temp=arr[min];
  24.               arr[min]=arr[i];
  25.               arr[i]=temp;
  26.          
  27.               }
  28.         }
  29.         public static void printarr(int[] arr)
  30.         {
  31.          
  32.           for (int i=0;i<arr.length;i++)
  33.                           {  
  34.                  System.out.print(arr[i]+" ");
  35.               }
  36.         }
  37.         
  38. }
  39.   //  输出的结果是 1 5 34 2 111 345 (问题:为什么呢?不是 1 2 5 34 111 345)
复制代码
在看自学视频,这个地方有点晕呀,新手 ,求帮忙,看下这个排序哪个步骤出问题了,谢谢了

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
  1.         public static void selectSort(int[] arr) {
  2.                 int temp = 0;
  3.                 int min = 0;
  4.                 for (int i = 0; i < arr.length - 1; i++) {
  5.                         min = i;
  6.                         for (int j = i + 1; j < arr.length; j++) {
  7.                                 if (arr[min] > arr[j])
  8.                                         min = j;
  9.                         }
  10.                         temp = arr[min];
  11.                         arr[min] = arr[i];
  12.                         arr[i] = temp;

  13.                 }
  14.         }
复制代码
min是记录最小值的标号 所以比较要用min去比较啊
你每次都用i在比较。。。
i又没有变动 只要数组中有小于i位置的数 就会记载min 所以min 中记录的不一定是最小的值的标号
而是最后一个小于i位置的值的标号

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
你的循环有问题 你只是实现了 当前位置的 数 与 一个比他小的对换  然后没有全部从新遍历
例如 第一次循环 换了1 跟2  第2次换了5 跟345 第3次换了111和 换到位置“4”的2  你看看是不是这样
回复 使用道具 举报
              for(int j=i+1;j<arr.length;j++)
                         {
                           if(arr[i]>arr[j])
                           min=j;
                        }
              temp=arr[min];
              arr[min]=arr[i];
              arr[i]=temp;
这块,换值的语句应该放到if判断里面;你这么写,相当于两个数判断了,但是却没有交换数,直到循环一轮完成后,最后一个比arr[i]小的与它调换,前面的记录都没有用,所以从第二个就出现了问题
感觉这个程序不需要设定min 只要用'i'判断就好了 只要是比他小,两个位置的数就调换就可以了
还有就是注意一下程序的格式的缩进问题 那样也会方便看程序了
回复 使用道具 举报

  1. //对数组{2,345,111,1,34,5}的选择排序
  2. class Test {
  3.         public static void main(String[] args) {
  4.                 int[] arr = { 2, 345, 111, 1, 34, 5 };
  5.                 selectSort(arr);
  6.                 System.out.println("排序后的数组为:");
  7.                 printarr(arr);
  8.         }

  9.         public static void selectSort(int[] arr) {
  10.                 int temp = 0;
  11.                 int min = 0;
  12.                 for (int i = 0; i < arr.length - 1; i++) {
  13.                         min = i;
  14.                         for (int j = i + 1; j < arr.length; j++) {
  15.                                 //if (arr[i] > arr[j])  把这里的i改为min即可。
  16.                                 //因为选择排序中,你定义的这个min的目的是记录后面最小值所在的下标。
  17.                                 //所以你应该拿这个min不断的与其他下标相比,而不是用i去比。
  18.                                 if (arr[min] > arr[j])
  19.                                         min = j;
  20.                         }
  21.                         temp = arr[min];
  22.                         arr[min] = arr[i];
  23.                         arr[i] = temp;

  24.                 }
  25.         }

  26.         public static void printarr(int[] arr) {

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

  31. }
  32. // 输出的结果是 1 5 34 2 111 345 (问题:为什么呢?不是 1 2 5 34 111 345)
复制代码
if (arr > arr[j])  把这里的i改为min即可。
因为选择排序中,你定义的这个min的目的是记录后面最小值所在的下标。
所以你应该拿这个min不断的与其他下标相比,而不是用i去比。

点评

嗯,明白了,谢谢  发表于 2012-11-11 23:21

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
廖力 发表于 2012-11-11 22:45
min是记录最小值的标号 所以比较要用min去比较啊
你每次都用i在比较。。。
i又没有变动 只要数组中有小于i ...

我晕,谢谢啦,看了你的解释,又去重新理解了遍选择排序的定义,自己刚开始的想法有些偏差,明白了,要拿那个min去和其他值去比较,感谢:victory:
回复 使用道具 举报
刘腾 高级黑马 2012-11-11 23:19:30
7#
张利 发表于 2012-11-11 22:59
for(int j=i+1;jarr[j])
                           min=j;
                        }

嗯,谢谢,感谢提供了另外一种思路。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马