Java - 选择排序 - 仅切换一次

时间:2014-12-12 03:53:27

标签: java

所以第一个开关肯定发生在最低值3和5之间,但在此之后它不会继续。这让我觉得其中一个for循环有问题吗?

  

公共类SelectionSort

     

{

     

public static void main(String [] args)

     

{

   int [] list;
   list = new int[5];
   list[0] = 4; 
   list[1] = 5;
   list[2] = 12;
   list[3] = 9;
   list[4] = 3;               
   for (int i = 0; i < list.length-1; ++i) {
       int index = i;
       for (int j = 1; j < list.length; ++j) {
           if (list[j] < list[index]) {
               int temp = list[j];
               list[j] = list[index];
               list[index] = temp;
           }
       }
   }
   for (int k = 0; k < list.length; ++k) {
       System.out.print(list[k] + ", ");
   }
 }
     

}

3 个答案:

答案 0 :(得分:0)

if (list[j] < list[index]) {之后,如果布尔语句得到满足,则必须更新索引,因此需要index = j并在

之后进行交换

见下文:

public class MySelectionSort {

    public static int[] doSelectionSort(int[] arr){

        for (int i = 0; i < arr.length - 1; i++)
        {
            int index = i;
            for (int j = i + 1; j < arr.length; j++)
                if (arr[j] < arr[index]) 
                    index = j;

            int smallerNumber = arr[index];  
            arr[index] = arr[i];
            arr[i] = smallerNumber;
        }
        return arr;
    }

答案 1 :(得分:0)

简短版:

for (int i = 0; i < list.length-1; i++)        
   for (int j = i+1; j < list.length; j++)
       if (list[j] < list[i]) {
           int temp = list[j];
           list[j] = list[i];
           list[i] = temp;
       }       
for (int k = 0; k < list.length; k++) {
   System.out.print(list[k] + ", ");
}

答案 2 :(得分:0)

for (int i = 0; i < list.length; ++i) {
    int index = i;
    for (int j = i + 1; j < list.length; ++j) {
        if (list[j] < list[index]) {
            index = j; }}
    if (index != i) {
        int temp = list[i];
        list[i] = list[index];
        list[index] = i; }}

为了减少掉期数量,j上的循环应该只是与项目i交换的最佳项目。对于i的每个值,最多应该有一个交换。 (那是什么使它成为一个选择排序。如果你为每个我做多次交换,你可能也在做冒泡排序。

但这是为了提高效率。你的代码不起作用的原因是你在j = 1而不是j = i + 1的j上开始循环。