2017-03-09 38 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应该足够)

相关问题