选择在Java中排序会产生不正确的结果

时间:2014-08-13 06:27:51

标签: java selection-sort

我是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

我正在做一些我无法弄清楚的小错误。有人可以帮我解决一下吗?

4 个答案:

答案 0 :(得分:13)

你快到了。

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

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

修复代码的另一种方法是保持交换位置,但在每次交换后更新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 */
}

这也有效,但效率很低。

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:6)

为什么你不能在比赛中使用比较器。由于您是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);
        }
    }
}

答案 3 :(得分:0)

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);