さらに別の不必要な答え!これは順列配列P
を明示的に保存します。これは私の状況では必要でしたが、コストが犠牲になります。また、これは正しく配置された要素を追跡する必要はありません。以前の回答が解決策を提供していることを理解しているO(N)
ので、これは娯楽のためだけだと思います!
最良のケースの複雑さO(N)
、最悪のケースO(N^2)
、および平均的なケースを取得しますO(NlogN)
。大規模な配列 (N~10000
またはそれ以上) の場合、平均的なケースは基本的にO(N)
です。
Java のコア アルゴリズムは次のとおりです (つまり、疑似コード *せきせき*)
int ind=0;
float temp=0;
for(int i=0; i<(n-1); i++){
// get next index
ind = P[i];
while(ind<i)
ind = P[ind];
// swap elements in array
temp = A[i];
A[i] = A[ind];
A[ind] = temp;
}
実行中のアルゴリズムの例を次に示します (以前の回答と同様)。
A = [a、b、c、d、e]とする
および P = [2, 4, 3, 0, 1]
次に期待される = [c、e、d、a、b]
i=0: [a, b, c, d, e] // (ind=P[0]=2)>=0 no while loop, swap A[0]<->A[2]
^ ^
i=1: [c, b, a, d, e] // (ind=P[1]=4)>=1 no while loop, swap A[1]<->A[4]
^ ^
i=2: [c, e, a, d, b] // (ind=P[2]=3)>=2 no while loop, swap A[2]<->A[3]
^ ^
i=3a: [c, e, d, a, b] // (ind=P[3]=0)<3 uh-oh! enter while loop...
^
i=3b: [c, e, d, a, b] // loop iteration: ind<-P[0]. now have (ind=2)<3
? ^
i=3c: [c, e, d, a, b] // loop iteration: ind<-P[2]. now have (ind=3)>=3
? ^
i=3d: [c, e, d, a, b] // good index found. Swap A[3]<->A[3]
^
done.
このアルゴリズムは、反復中の最大回数までwhile
、任意の index に対してそのループ内を跳ね回ることができます。最悪の場合 (私が思うに!)、外側のループを反復するたびにループから追加の代入が発生するため、算術級数が発生し、複雑さが増します! ただし、これを の範囲で実行し、ループに必要な「余分な」割り当ての数を平均すると(つまり、それぞれの多くの順列の平均)、平均的なケースが であることが強く示唆されます。j<i
i
ith
for
i
while
N^2
N
while
N
O(NlogN)
ありがとう!