2016-04-21 100 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; 
    }