プログラミング スキルを向上させるための計画の一環として、文字列の大きな配列を辞書順にソートすることにしました (後でスレッドを使用してソートする予定です)。私はさまざまなソートアルゴリズムを調査し、理解したものからマージソートを実装しようとしました。今のところ、いくつかの単純な文字列を並べ替える予定です。
以下のメソッドでソートする次の文字列を入力しています。
string[] stringsArray = new string[] { "cixymn", "adfxij", "adxhxy", "abcdef", "iejfyq", "uqbzxo", "aaaaaa" };
string[] stringSorted = MergeSort(stringsArray);
// For display purposes
foreach (string s in stringSorted)
{
Console.WriteLine("Item at index " + Array.IndexOf(stringSorted, s) + " is " + s);
}
私が得ている結果は次のとおりです。
Item at index 0 is aaaaaa
Item at index 1 is abcdef
Item at index 2 is adfxij
Item at index 3 is uqbzxo
Item at index 4 is
Item at index 4 is
Item at index 4 is
マージソートを実装するには、まず配列を 2 つに分割する必要があるため、この場合、左の部分は正常にソートされ、右の部分は無視されていることが容易に理解できます。すべての再帰で配列の左側から各文字列の文字を比較しているため、これが起こっているという印象を受けています(したがって、右側を無視する可能性があります)。それで、問題がどこにあるのかを実際に理解したと思います。しかし、私はこれについてどうすればよいのかよくわかりません。どんな助けでも大歓迎です。
以下は、MergeSort メソッドのコードです。
private static string[] MergeSort(string[] stringsArray)
{
if (stringsArray.Length == 1)
{
return stringsArray;
}
int middle = stringsArray.Length / 2;
string[] left = new string[middle];
string[] right = new string[stringsArray.Length - middle];
for (int i = 0; i < middle; i++)
{
left[i] = stringsArray[i];
}
for (int i = 0; i < stringsArray.Length - middle; i++)
{
right[i] = stringsArray[i + middle];
}
left = MergeSort(left);
right = MergeSort(right);
int leftPointer = 0;
int rightPointer = 0;
string[] sorted = new string[stringsArray.Length];
for (int k = 0; k < stringsArray.Length; k++)
{
if (k == left.Length)
{
break;
}
for (int i = 0; i < left[leftPointer].Count(); i++)
{
var leftChar = left[leftPointer][i];
if (i == right[rightPointer].Count())
{
continue;
}
var rightChar = right[rightPointer][i];
if ((rightPointer == right.Length || leftPointer < left.Length) && leftChar < rightChar)
{
sorted[k] = left[leftPointer];
sorted[k + 1] = right[rightPointer];
leftPointer++;
break;
}
if ((leftPointer == left.Length || rightPointer < right.Length) && (rightChar < leftChar))
{
sorted[k] = right[rightPointer];
sorted[k + 1] = left[leftPointer];
rightPointer++;
break;
}
}
}
質問 #2 : スレッド化を使用できるようにするために、コードをどのように最適化することをお勧めしますか?