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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 低调的华丽 初级黑马   /  2013-8-1 11:46  /  1343 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-8-1 18:01 编辑

public class select{
   public static void main(String[] args){
        int[] arr={2,345,111,1,34,5};
         int temp=0;
         int min=0;
         for(int i=0;i<arr.length;i++){
              min=i;
            
             for(int j=i+1;j<arr.length;j++){
                if(arr>arr[j])
                       min=j;
               }
              temp=arr[min];
              arr[min]=arr;
              arr=temp;
         
            }
          System.out.println("排序后的数组为:");
         for (int i=0;i<arr.length;i++){
            
             System.out.print(arr+" ");
           }
    }
   }
    输出的结果是 1 5 34 2 111 345 (问题:为什么呢?if(arr>arr[j]  改成 arr[min]>arr[j] 有什么区别)

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 李政 于 2013-8-1 12:21 编辑

class select{
    public static void main(String[] args){
         int[] arr={2,345,111,1,34,5};
          int temp=0;
          int min=0;
          for(int i=0;i<arr.length-1;i++){//这里可以优化一下,写成length-1,因为比完倒数第二个角标的时候,最后一个角标已经是个最值了
               min=i;
            
              for(int j=i+1;j<arr.length;j++){
                 if(arr[min]>arr[j])//应该拿最小的去和下一个数比较,而不是每次都拿i去比较。
//比如当i=1时 arr=345 当arr[j]=1 min = 1 当arr[j] = 5的时候 min = 5了
                        min=j;
                }
               temp=arr[min];
               arr[min]=arr;
               arr=temp;
         
             }
           System.out.println("排序后的数组为:");
          for (int i=0;i<arr.length;i++){
              
             System.out.print(arr+" ");
            }
     }
    }
(我郁闷了 ,编辑了好几次 i这个角标怎么就显示不出来呢 )

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
public static void main(String[] args) {
                // TODO Auto-generated method stub
                 int[] arr={2,345,111,1,34,5};
         int temp=0;
         int min=0;
         for(int i=0;i<arr.length;i++){
              min=i;
            
             for(int j=i+1;j<arr.length;j++){
                if(arr[min]>arr[j])//这里应拿每次比较之后较小的那个数与之后的数作比较
                       min=j;//将每次比较后较小元素的下标值赋给min
               }
              temp=arr[min];
              arr[min]=arr[i];
              arr[i]=temp;
         
            }
          System.out.println("排序后的数组为:");
         for (int i=0;i<arr.length;i++){
            
             System.out.print(arr[i]+" ");
           }
        }


运行结果是:

排序后的数组为:
1 2 5 34 111 345

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
李政 发表于 2013-8-1 12:05
class select{
    public static void main(String[] args){
         int[] arr={2,345,111,1,34,5};

懂了,谢谢你
回复 使用道具 举报
李政 发表于 2013-8-1 12:05
class select{
    public static void main(String[] args){
         int[] arr={2,345,111,1,34,5};

应该拿min去比,而不是i,谢谢 各位。
回复 使用道具 举报
有很大区别。在每一轮进行比较时,i是不变的,min是变量。在内循环中。应该用不断改变的min与后面的相比较,这样才能求得真正的最值。而拿一个不变i的i比较。只能得到比arr[i]大的或小的。并不一定每次都得到最值。实际上大多数很可能得到一个刚好大一点点的或小一点点的。所以不行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马