📕 パーティション.
📌パーティションの特徴.
- jがpからr-1まで毎回1回つ後方に移動するので、計算量O(n)のアルゴリズム.
📌パーティションの手順.
- 配列Aのpatitionの範囲はpからr(それぞれ含む)まで.
- partitionの基準となるA[r]をxと設定.
- x以下の要素はp〜iまでの範囲に、xより大きい要素はi+1〜jまでの範囲に移動させる.
数列{3,9,8,1,5,6,2,5}に対してpartitionを行う場合は以下のとおり.
パーティションは離れた要素を交換するので、ソートに応用する場合には注意が必要.
#include <iostream>
using namespace std;
int A[] = {13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11};
int n = 12;
// 基準となるx以下の要素がpからiまでの範囲(iを含む)
// xより大きな要素がi+1からjまでの範囲(jを含まない)
int partition(int p, int r) {
// 基準値は最後方要素
int x = A[r];
// グループ1(x以下の要素)中の最大Idx
int i = p - 1;
// グループ2(xより大きい要素)中の最大Idx-1
int j;
// 毎回の計算ステップでは必ずjを+1してA[j]をどちらのグループに属するか判定
int t;
for (j = p; j < r; j++) {
// A[j]がx以下の場合、A[j]とA[i]を交換
if (A[j] <= x) {
i++;
t = A[i];
A[i] = A[j];
A[j] = t;
}
// A[j]がxよりも大きい場合、要素の移動はなし
}
t = A[i + 1], A[i + 1] = A[r]; A[r] = t;
return i + 1;
}
🔎対象ソースは以下に格納.
/source/5.hsort/partition.cpp