配列 S を入力として受け取り、S を 3 つのセット (負、ゼロ、および正) に分割する O(n) アルゴリズムを指定します。これをその場で、つまり新しいメモリを割り当てずに実装する方法を示します。また、番号の相対的な順序を維持する必要があります。例: {-1, 4, 0, -2, 1, 2} ==> {-1, -2, 0, 4, 1, 2}
そのような解決策が存在するかどうかはわかりません。私が考えることができる最善の解決策は次のとおりです。
解決策 1: 追加の整数配列を使用して、配列全体をトラバースして、負の値、0、正の値の順に取得します。
解決策 2: 数値の相対順序を保持しない。次に、配列を 2 回ループします。
template <typename Type>
void Partion(Type *array, int begin, int end, Type v, int &l, int &r)
{
l = begin;
for (int i=begin; i!=end; ++i)
{
if (array[i] < v)
swap(array[i], array[l++]);
}
r = l;
for (int j=l; j!=end; ++j)
{
if (array[j] == v)
swap(array[j], array[r++]);
}
}