以下のコードは、私のクイック選択 (ソートされた配列全体ではなく、ソートされた配列の n 番目の項目を返すことを除いて、クイックソートに非常に似ています) メソッドです。入力は文字列 (単語) の配列であり、指定された単語が並べ替えられている場合、n 番目のインデックスの単語を返す必要があります。
static string QuickSelect(string[] lst, int index) {
if (lst.Length == 1)
{
Console.Write(lst[0]);
return lst[0];
}
else
{
int pivot = _r.Next(lst.Length); // pick a pivot by random number generator
bool[] isDecre = new bool[lst.Length];
string[] WordLeft, WordRight;
int nLeft = 0, nRight = 0;
for (int i = 0; i < lst.Length; i++) // compare values to pivot
{
if (i == pivot) continue;
if (WordCompare(lst[pivot], lst[i]))
{
nRight++;
isDecre[i] = false;
}
else
{
nLeft++;
isDecre[i] = true;
}
}
if (nLeft == index) // pivot was the (index)th item in the list
return lst[pivot];
else
{
WordLeft = new string[nLeft];
WordRight = new string[nRight];
int l = 0, r = 0;
// divide list by saved comparison result
for (int i = 0; i < lst.Length; i++)
{
if (i == pivot) continue;
if (isDecre[i])
{
WordLeft[l] = lst[i];
l++;
}
else
{
WordRight[r] = lst[i];
r++;
}
}
if (nLeft > index)
return QuickSelect(WordLeft, index);
else if (nLeft < index)
return QuickSelect(WordRight, index - nLeft - 1);
}
}
}
問題は、このコードが実行されず、「すべてのコード パスが値を返すわけではない」というエラーがスローされることです。私はそれがこの部分に関係していると思います:
if (nLeft == index) // pivot was the (index)th item in the list
return lst[pivot];
// build left and right word lists
...
if (nLeft > index)
return QuickSelect(WordLeft, index);
else if (nLeft < index)
return QuickSelect(WordRight, index - nLeft - 1);
上記の「else if」の後に「else」を置くと、エラーはなくなります。しかし、ピボットが n 番目のインデックス文字列である場合、左右の単語リストを作成したくありません。実際、この値を返さないパスが検出されるのはナンセンスだと思います。回避策はありますか?