【问题标题】:Selection Sort in Java produces incorrect resultsJava中的选择排序产生不正确的结果
【发布时间】:2014-10-06 09:56:49
【问题描述】:

我是 Java 新手,我正在尝试编写一个选择排序程序。 以下是我的代码:

public class SelectionSort {
    public static int a[] = {6, 4, 9, 3, 1, 7};

    public static void main(String[] args) {
        int min, i, j;
        for(i = 0; i < a.length - 1; i++) {
            min = i ;
            for(j = i + 1; j < a.length; j++) {
                if (a[j] < a[min]) {
                    min = j; 
                }
                if (min != i) {
                    int temp = a[i];
                    a[i] = a[min];
                    a[min] = temp;
                }
            }
        }
        for (i = 0; i < a.length; i++) {
            System.out.println("a : " + a[i]);
        }
    }
}

我的输入数组是6,4,9,3,1,7。排序后的输出应该是1,3,4,6,7,9 但我得到的输出是:

a : 3
a : 4
a : 6
a : 7
a : 1
a : 9

我犯了一些我无法弄清楚的小错误。谁能帮我解决一下?

【问题讨论】:

  • +1。您提供了短代码、输入、预期输出和实际输出。

标签: java selection-sort


【解决方案1】:

你快到了。

交换元素的部分应该内部循环之外。

换句话说,您需要首先找到数组剩余部分中的最小元素,然后将其交换到当前位置。现在,一旦找到较小的数字,您就会立即进行交换,并且在此过程中无法跟踪这个较小数字的新位置。

修复代码的另一种方法是将交换保留在原处,但在每次交换后更新min

if (min !=i) {
    int temp = a[i];
    a[i] = a[min];
    a[min]= temp;
    min = i;       /* Update `min' to reflect the number's new position */
}

这也可以,但效率很低。

附: if (min != i) 检查是不必要的,因为与自身交换元素是无害的无操作。

【讨论】:

    【解决方案2】:

    您正在为内部循环的每次迭代交换元素 将下面的块放在内部循环之外。您应该只为外循环的每次迭代进行交换。

             if (min !=i) {
                    int temp = a[i];
                    a[i] = a[min];
                    a[min]= temp;
                }
    

    【讨论】:

    • 哦,是的,我现在知道了。但是如果交换代码在内部循环中会发生什么?
    • @Newbie - 每次您的 (min !=i) 条件为真时,您都在交换。你最终会交换一个已经交换的值,也就是说,你的数组实际上是无序(相对于每次迭代的预期输出)迭代。
    【解决方案3】:

    为什么不能在集合中使用比较器。由于您是 java 新手,因此您也可以学习 java 提供的功能。请检查以下示例。

    import java.util.Comparator;
    
    public class MyIntComparator implements Comparator<Integer>{
        @Override
        public int compare(Integer o1, Integer o2) {
            return (o1>o2 ? -1 : (o1==o2 ? 0 : 1));
        }
    }
    --------------------------------------------------------
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class Simple2 {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList<Integer>();
            list.add(5);
            list.add(4);
            list.add(3);
            list.add(7);
            list.add(2);
            list.add(1);
            Collections.sort(list, new MyIntComparable());
            for (Integer integer : list) {
                System.out.println(integer);
            }
        }
    }
    

    【讨论】:

    • 但这并不能真正回答问题,是吗?
    • 这是改变方法的答案。 :)
    • 你的类是comparator而不是comparable,所以要正确命名。
    【解决方案4】:
    Simple logic to approach any algo is to break into multiple step :
        
    ### Step 1 − Set MIN to location 0 or any high Value
        ### Step 2 − Search the minimum element in the list
        ### Step 3 − Swap with value at index of minimum
        ### Step 4 − Repeat until iteration gets over
    e.g. <br>
    14, 33, 27, 10, 35, 19, 42, 44 <br>
    **10**, 33, 27, **14**, 35, 19, 42, 44 <br>
    10, **14**, 27, **33**, 35, 19, 42, 44 <br>
    10, 14, **19**, 33, 35, **27**, 42, 44 <br> 
    10, 14, 19, **27**, 35, **33**, 42, 44 <br>
    10, 14, 19, 27, **33**, **35**, 42, 44 <br>
    10, 14, 19, 27, 33, 35, **42**, 44 skip as no min found
    
        
        
            final int[] intArr = new int[]{14, 33, 27, 10, 35, 19, 42, 44};
            int index = -1;
            boolean isMin;
            for (int i = 0; i < intArr.length; i++) {
              int min = 999999999;
              isMin = false;
              for (int j = i + 1; j < intArr.length; j++) {
                if (intArr[j] < min && intArr[i] >= intArr[j]) {
                  min = intArr[j];
                  index = j;
                  isMin = true;
                }
              }
              if (isMin) {
                intArr[index] = intArr[i];
                intArr[i] = min;
              }
            }
            Arrays.stream(intArr).forEach(System.out::println);
    

    【讨论】:

      猜你喜欢
      • 2021-10-29
      • 1970-01-01
      • 2014-05-13
      • 2020-12-14
      • 2015-10-12
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多