現在、文字列を同時にソートするプログラムに取り組んでいます。私のプログラムはファイルを受け取り、ファイルの各行を配列に読み取り、文字列の配列をより小さな文字列の配列に分割します。次に、プログラムは小さい配列ごとに 1 つのスレッドを開始し、それらをクイックソートします。すべてのスレッドが配列の並べ替えを完了すると、メイン スレッドはスレッド オブジェクトからすべての結果を収集します。次に、ソートされた小さい配列を 1 つの大きなソートされた配列にマージすることになっています。
私は現在、シングルスレッドマージソートを使用して、クイックソートスレッドによって返されたソート済み配列をネストすることでこれを解決しました。ここでの問題は、マージが同時に行われないため、少数のスレッド (1 ~ 4) を使用してファイル内をソートすると、実際にはプログラムのソートが可能な限り高速になることです。スレッドの数を少し (たとえば 15 スレッド) 増やすと、実際にはプログラムの実行速度はスレッド数が少ない場合よりもかなり遅くなります。これを解決するために、マージソート/配列のネストに並行性を導入したいと考えています。
私がやりたいことは、2 つのスレッドがファイル内の部分のクイックソートを完了すると、ファイル内のすべての部分がソートされるまで、新しいスレッドがこれら 2 つの部分を一緒にネストすることです。
サンプルコードや疑似コードに感謝します。前もって感謝します!:)
配列をソートする現在のコード:
public synchronized String[] sort(){
String[] sortedWords = new String[words.length];
SortingThread[] sts = new SortingThread[threads];
for(int i = 0; i < threads; i++){
sts[i] = new SortingThread(this, splitWords[i]);
}
for(SortingThread st : sts){
st.start();
}
for(SortingThread st : sts){
try {
st.join();
} catch (InterruptedException e) {
e.printStackTrace();
System.exit(-1);
}
}
indexes = new int[sts.length];
for(int i = 0; i < indexes.length; i++){
indexes[i] = 0;
}
//This is where my merge-sorting currently starts.
ArrayList<String> toAddTo = new ArrayList<String>();
while(!allIndexesHaveBeenRead(sts)){
String globalMinimum = null;
int globalMinThread = -1;
currentIteration: for (int i = 0; i < sts.length; i++) {
String current;
try{
current = sts[i].sorted[indexes[i]];
} catch(Exception e){
continue currentIteration;
}
try{
if(globalMinimum == null){
globalMinimum = current;
globalMinThread = i;
}
else if(current.compareTo(globalMinimum) < 0){
globalMinimum = current;
globalMinThread = i;
}
} catch (NullPointerException e){
continue;
}
}
toAddTo.add(globalMinimum);
indexes[globalMinThread]++;
}
sortedWords = toAddTo.toArray(sortedWords);
int len = 0;
for (int i = 0; i < sortedWords.length; i++) {
if(sortedWords[i] != null){
len++;
}
}
String[] toReturn = new String[len];
for (int i = 0; i < toReturn.length; i++) {
toReturn[i] = sortedWords[i];
}
return toReturn;
}