良い一日!ここに、クイックソートを行う Java プログラムがあります。ファイルを読み取り、その中の最初の 10,000 語をソートします。私は Thomas Cormen の Introduction to Algorithms, Second Ed の疑似コードに従いました。
import java.io.*;
import java.util.*;
public class SortingAnalysis {
public static int partition(String[] A, int p, int r) {
String x = A[r];
int i = p-1;
for (int j=p; j < r-1; j++) {
int comparison = A[j].compareTo(x);
if (comparison<=0) {
i=i+1;
A[i] = A[j];
}
}
A[i+1] = A[r];
return i+1;
}
public static void quickSort(String[] a, int p, int r) {
if (p < r) {
int q = partition(a, p, r);
quickSort(a, p, q-1);
quickSort(a, q+1, r);
}
}
public static void main(String[] args) {
final int NO_OF_WORDS = 10000;
try {
Scanner file = new Scanner(new File(args[0]));
String[] words = new String[NO_OF_WORDS];
int i = 0;
while(file.hasNext() && i < NO_OF_WORDS) {
words[i] = file.next();
i++;
}
long start = System.currentTimeMillis();
quickSort(words, 0, words.length-1);
long end = System.currentTimeMillis();
System.out.println("Sorted Words: ");
for(int j = 0; j < words.length; j++) {
System.out.println(words[j]);
}
System.out.print("Running time: " + (end - start) + "ms");
}
catch(SecurityException securityException) {
System.err.println("Error");
System.exit(1);
}
catch(FileNotFoundException fileNotFoundException) {
System.err.println("Error");
System.exit(1);
}
}
}
しかし、コードを実行すると、
Exception in thread "main" java.lang.StackOverflowError
at SortingAnalysis.partition and quickSort
サイズが大きい (つまり 10000) ためにエラーが発生したと思われるため、代わりに 100 に減らしたとコンソールに表示されます。ただし、ファイルから最初の 100 単語をソートするのではなく、100 番目の単語を 100 回表示します。
コードの修正を手伝ってください。私はJavaが初めてで、皆さんの助けが必要です。どうもありがとうございました!
編集:コードを編集しました。が 10000に達してもエラーは発生しなくなりました NO_OF_WORDS
。問題は、間違ったシーケンスを停止することです。