Javaシーケンス分割問題アルゴリズム実装
3177 ワード
Javaシーケンス分割問題アルゴリズム実装
問題の説明
入力:シーケンスA[p...r]出力:下付きq(p<=q<=r)と元のシーケンスA[p...r]の再配列新しい配列満足:A[q]=A[r]A[p...q]の各要素がA[q]A[q+1...r]の各要素よりA[q]より大きい
アルゴリズム思想
アルゴリズムはA[r]を利用してシーケンスを2つのセグメントに分ける必要があり、総長は依然としてrであり、左から右にシーケンスをスキャンすることができ、次第にA[r]より大きくない数とA[r]より大きい数を分離することができる.アルゴリズムは、iを現在の分割結果の境界線として使用する2つの下表i=p−1,j=pを維持する.すなわち、iより小さいすべてのスケールがiより大きいシーケンス数はA[r]より大きくなく、jを現在のスキャン位置として使用する.すなわち、iより大きいサイズがjより大きいシーケンス数はA[j]より大きい.i,jを初期化すると,j->rがインクリメントされ,A[j]がA[r]より小さいか否かが判断され,成立するとA[i+1],A[j]が交換される.
ここでは実際にi++を用いてA[r]未満の数を増やし、A[r]より大きい最初の数を最後に移動する.
j=rのとき,最終的な分割シーケンスを得た.
アルゴリズム実装
アルゴリズム時間
f(n) = n = O(n)
プレゼンテーションの結果
q = 7 1 3 5 6 0 10 20 232 30 112 23 111
問題の説明
入力:シーケンスA[p...r]出力:下付きq(p<=q<=r)と元のシーケンスA[p...r]の再配列新しい配列満足:A[q]=A[r]A[p...q]の各要素がA[q]A[q+1...r]の各要素よりA[q]より大きい
アルゴリズム思想
アルゴリズムはA[r]を利用してシーケンスを2つのセグメントに分ける必要があり、総長は依然としてrであり、左から右にシーケンスをスキャンすることができ、次第にA[r]より大きくない数とA[r]より大きい数を分離することができる.アルゴリズムは、iを現在の分割結果の境界線として使用する2つの下表i=p−1,j=pを維持する.すなわち、iより小さいすべてのスケールがiより大きいシーケンス数はA[r]より大きくなく、jを現在のスキャン位置として使用する.すなわち、iより大きいサイズがjより大きいシーケンス数はA[j]より大きい.i,jを初期化すると,j->rがインクリメントされ,A[j]がA[r]より小さいか否かが判断され,成立するとA[i+1],A[j]が交換される.
ここでは実際にi++を用いてA[r]未満の数を増やし、A[r]より大きい最初の数を最後に移動する.
j=rのとき,最終的な分割シーケンスを得た.
アルゴリズム実装
/**
*
* @author Chuck
*
*/
public class Partition {
public static int partition(int [] arr){
int n = arr.length;
int i = -1;
int j = 0;
int tmp = -1;
//
while(j < n){
// , arr[n-1] , A[i+1]
if(arr[j] <= arr[n-1]){
i++;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
j++;
}
//
return i+1;
}
public static void main(String [] args){
int [] arr = {1,3,30,5,6,23,111,232,0,112,10,20};
int q = Partition.partition(arr);
System.out.println("q = " + q);
for(int i=0;i" ");
}
}
}
アルゴリズム時間
f(n) = n = O(n)
プレゼンテーションの結果
q = 7 1 3 5 6 0 10 20 232 30 112 23 111