配列の中央値を返すアルゴリズムを実装する必要があります。そこで、これには効率的であると思われる Quickselect を実装することにしました。3 分割には、Quicksort で使用されているものと同じ分割アルゴリズムを使用できることがわかりました。
私の講義ノート (C コード) で報告されているパーティション アルゴリズムは次のとおりです。
for (i = lo, j = hi;
(i <= j);)
{
while (a[i] < pivot)
{
i++;
}
while (a[j] > pivot)
{
j--;
}
if (i <= j)
{
if (i < j)
{
/* exchange values */
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
i++;
j--;
}
}
ここで、配列が a = [40, 20, 100, 60, 80] で、ピボットとして 80 を選択すると、結果は a = [40, 20, 80 , 60, 100] になりますが、右側のパーティションの値がすべて > 80 ではないことがわかります (60 あります)。他の数値を選択すると、アルゴリズムは適切に機能します。
このアルゴリズムは間違っていますか?
事前に助けてくれてありがとう!