2016-04-21 98 views
-1

这是我的计划的一部分:为什么我的选择将数组按顺序排序?

private static int[] array = {5, 2, 3, 1, 4, 7, 8, 6, 10, 9}; 

private static void selectionSort(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; 
     } 
    } 

    for (int i = 0; i < arr.length; i++) 
    { 
     System.out.print(arr[i]); 
    } 
} 

我试图理清所有号码的秩序。它是印刷如下:

1 3 2 5 4 6 7 8 9 10 

我不明白为什么有些数字是为了,而其他人不是。任何人都可以协助吗?

+1

请将最后一个'for'语句移到第一个以外,以便按照您的预期进行编译。然后,你在调试器中逐步运行你的代码时发现了什么? – Savior

回答

1

您应该将arr[j]arr[index](而不是arr[i])进行比较,您不应该交换元素直到内部循环完成。你可以使用Arrays.toString(int[])来打印你的数组。喜欢的东西,

private static void selectionSort(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; 
      } 
     } 
     if (index != i) { 
      int smallerNumber = arr[index]; 
      arr[index] = arr[i]; 
      arr[i] = smallerNumber; 
     } 
    } 
} 

public static void main(String[] args) { 
    int[] array = { 5, 2, 3, 1, 4, 7, 8, 6, 10, 9 }; 
    selectionSort(array); 
    System.out.println(Arrays.toString(array)); 
} 

输出是(预期)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
0

认为这是不好的

 if (arr[j] < arr[index]) 

,应该是

 if (arr[j] < arr[i]) 

因为你总是移动最小一个到我目前的位置。

或者如果你想优化,像Elliot建议的那样做最后的交换。

不工作,你不能只是每次交换,只有当数量较小,所以移动if内的交换。你也可以摆脱索引,除非你只想在最后交换,否则它是无用的。

if (arr[j] < arr[i]) 
    { 
     int smallerNumber = arr[j]; 
     arr[j] = arr[i]; 
     arr[i] = smallerNumber; 
    }