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[i]>arr[j])
                       min=j;
               }
              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 5 34 2 111 345 (问题:为什么呢?if(arr[i]>arr[j]  改成 arr[min]>arr[j] 有什么区别)(说明一下用这个 arr[i]>arr[j] 条件 错误的原因)

解决方案 »

  1.   

    选择排序就是第一次选出最小的放在第一个位置,第二次选出第二小的放在第二个位置,…………直到N所以每次迭代,都要选择目前最小的元素,min代表目前最小的元素的下标
    if(arr[min]>arr[j])说明有比min指示的元素更小的,需要更新if(arr[i]>arr[j])只是比较了两个相邻的元素
    lz把选择排序和冒泡排序整混了好好看看书
      

  2.   

    选择排序是先假设第一个数为最小,再将后面的数依次与第一个数比较,有更小则交换,这样一轮比较后最小的数就放在了第一个。
    然后再假设第二个数为最小,再如法炮制与后面的数依次比较,就这样要进行N-1轮比较
    public class select{
        public static void main(String[] args) {
            int[] arr = {2, 345, 111, 1, 34, 5};
            int temp = 0;
            for (int i = 0; i < arr.length - 1; i++) { //第一层循环到N-1即可            for (int j = i + 1; j < arr.length; j++) {
                    if (arr[i] > arr[j]) {
                        temp = arr[j];
                        arr[j] = arr[i];
                        arr[i] = temp;
                    }
                }
            }
            System.out.println("排序后的数组为:");
            for (int i = 0; i < arr.length; i++) {            System.out.print(arr[i] + " ");
            }
        }
      

  3.   

          for (int i = 0; i < arr.length - 1; i++) { //第一层循环到N-1即可  for (int j = i + 1; j < arr.length; j++) {
      if (arr[i] > arr[j]) {
      temp = arr[j];
      arr[j] = arr[i];
      arr[i] = temp;
      }
       冒泡排序。。??
      

  4.   

    就是那儿错了,应该是arr[min]>arr[j]如果是arr[i]>arr[j]的话意思就是从i+1到arr.length-1中随便找一个比 arr[i]小的数放在arr[i]处,显然这样是不对的。
      

  5.   

    冒泡排序是比较相邻的两个数,小的放前面,大的放后面,我这个是arr[i]与它后面的数都比较一次,有更小的则与a[i]交换
      

  6.   

    因为min不断的在变化,所以arr[i]与arr[min]不同
      

  7.   

    1、首先,for j那一个已经有问题了,如果j=i+1开始,后面元素都是a[i]>a[j]的呢?那不是乱了?只要小于的,都是min=j了?
    2、我感觉如果是我写的话,会是  for(int i=0;i<arr.length;i++)
    {
       for(int j=i+1;j<arr.length;j++){
       if(arr[i]>arr[j])
    (temp=arr[i];
      arr[i]=arr[j];
      arr[j]=temp;}
       }   
    }