2017-03-09 37 views
-5

我剛剛遇到這個代碼,我應該打開一個實驗室任務。代碼的作用是輸入一個包含單詞列表的「.dat」(文件中的第一行是數據集的數量)。然後它檢查「.dat」文件中每個單詞的長度,並根據長度進行排序。最低的字母數是第一個,最高的是最後一個。這是代碼。爲什麼我們在for循環中乘以2?

Scanner scan = new Scanner(new File("words.dat")); 

int dataSets = scan.nextInt(); 
scan.nextLine(); 

String[] words = new String[dataSets]; 
//int[] length = new int[dataSets]; 

for(int a=0; a<dataSets; a++) 
{ 
    words[a] = scan.next(); 
} 

Arrays.sort(words); 

for(int a = 0; a < words.length * 2; a++) //what is the purpose of this forloop? 
{ 
    for(int i = 0; i < words.length; i++) 
    { 
     if(i < words.length - 1) 
     { 
      if(words[i].length() > words[i + 1].length()) 
      { 
       String temp = words[i]; 

       words[i] = words[i + 1]; 

       words[i + 1] = temp; 
      } 
     } 
    } 
} 

for(String word : words) 
{ 
    System.out.println(word); 
} 

我不明白爲什麼我們乘的第一個for循環由2

for(int a = 0; a < words.length * 2; a++) 
+2

快速閱讀,這看起來是一個不高效的泡沫排序。但複雜性是O(n^2),所以解釋這個錯誤,這不需要這個'* 2',因爲這是在兩個循環中完成的。 – AxelH

+4

「我剛剛遇到這個代碼,在。」你的意思是你偷了某人的代碼,目的是把它作爲你自己的任務,但你不明白它? – Kayaman

+0

[Bubble sort - Wikipedia](https://en.wikipedia.org/wiki/Bubble_sort)。你會用動畫例子找到這個算法的一個很好的解釋。 – AxelH

回答

1

我認爲這是一個基本執行冒泡排序。你可以在wiki上找到這個算法的說明。

簡而言之,這個算法將檢查每一對,並在需要時反轉它。爲了得到完全排序的結果,他們需要在最壞的情況下解析數組n*nn2而不是n*2

順便說一句,Arrays.sort(words);已經排序的數組。

+1

我想按字母順序排列。所以Arrays.sort不會排序我怎麼想它排序 – Kanna6501

+1

@ Kanna6501但你只需要實現一個比較傳遞到['排序(T []一,比較 C)'](https://開頭docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(T[],%20java.util.Comparator))來完成這項工作。 PS:它確實最壞的情況是需要'n * 2'讀數,而不是在第一個循環中進行迭代。所以這是每次訪問數組的總和(兩個循環的總和);) – AxelH

0

需要外循環,因爲它可能會循環地完全排序數組的幾個迭代。

你可以很容易地通過展示不同的硬編碼值替換words.length * 2這種行爲,所以你會看到怎樣的陣列寫入時的那種可能需要多次反覆。

words.length * 2確保足夠的迭代已經發生,數組才能正確排序...(在氣泡排序中,外循環必須對數組中的每個元素迭代一次,所以words.length應該足夠)

相關問題