0、1、または 2 を含むリンク リストを並べ替えたいと思っていました。さて、これは明らかにオランダ国旗問題の変種です。 http://en.wikipedia.org/wiki/Dutch_national_flag_problem
リンクに示されているのと同じアルゴリズムは次のとおりです。
「上のグループを配列の上から下に、下のグループを下から上に成長させ、中央のグループを下のすぐ上に保持します。アルゴリズムは、上のグループのすぐ下、下のすぐ上、および3 つのインデックスの真ん中のすぐ上. 各ステップで, 真ん中のすぐ上の要素を調べます. 上のグループに属している場合は, 一番上の要素と交換します. 下のグループに属している場合は, 上の要素と交換します.底のすぐ上にある場合はそのままにしておきます。適切なインデックスを更新します。複雑さは Θ(n) 回の移動と検査です。"
そして、同じために与えられた C++ 実装は次のとおりです。
void threeWayPartition(int data[], int size, int low, int high) {
int p = -1;
int q = size;
for (int i = 0; i < q;) {
if (data[i] == low) {
swap(data[i], data[++p]);
++i;
} else if (data[i] >= high) {
swap(data[i], data[--q]);
} else {
++i;
}
}
}
私の唯一の質問は、ここで配列で行っているように、リンクされたリストをどのようにトラバースするかということです。