トピック:エラーで別のジョブのバックよりも前にある人ならば、人々は、キューの前と後のローからハイへ順に配置されている。
例:[176,178,180,170,171]でエラーが発生します
<176170> <176171> <178170> <178171> <180170> <180171>。
今、整数のシーケンスからすべてのこのようなエラーを識別するために尋ねました。
分析:
- 逆順(反転ペア):Nの数、サイズ、逆の順序の数を決定することができる[0、N(N-1)/ 2]、及びマージソート逆にシーケンス番号を要求する、時間複雑です(NlogN)O、空間的複雑さはO(N)です。
- ファイルが既に子供がソートされているので、することができ、逆に関与する大きなファイルを取得するためのソート後キッドファイル; M =(iはJ + 1)/ 2処理デジタル再帰的配列は、最初の計算された子供のファイルに逆とソート使用します比較演算の多くを避けます。
問題解決:
1 INTパーティション(INT *配列、int型 Iは、INT J){ 2 / * * 3 *最終的なソート順序を記憶された追加のスペースO(N)を用いて 4 * * / 5 INT M =(Iは、J + 1)/ 2 。 6 INT TARRAY [J-I + 1 ]; int型のインデックス= 0 ; 7 int型のTi = I、TJ = Mの+ 。1 ; 8 int型 COUNT = 0 ; 9 10 のprintf(" \ N-%D、%のDは、%D、%D "、I、J、配列[I]、配列[J]) 。11 ながらチタン(Ti <= M && TJ <= J){ 12で IF(配列[チタン]> 配列[TJ]){ 13は、 / * * 14 *正しい配列にのみ要素が左シーケンス未満であることに注意してください 15 素子、カウント値が増加しない*、及びに従って 16 種類の特性*逆順合計を導出することができる 17。 * * / 18である COUNT + = M-のTi + 1 ; 19 TARRAY [インデックス] = 配列[TJ]; 20である TJ ++ ; 21である } さもなければ{ 22は TARRAY [インデックス] = 配列[チタン]; 23である のTi ++ ; 24 } 25 インデックス++ ; 26である } 27 / * * 28 *注処理するとき、左右の配列の残りの要素を、既にソートされ、ため 29 *はTARRAYに直接コピーすることができで 30 * * / 31である IFチタン(Ti> M){ 32 ながら(TJ <= J){ 33は TARRAY [インデックス] = 配列[TJ]; 34である TJ ++;インデックス++ ; 35 } 36 37 } そう であれば(TJ> J){ 38 ながら(TI <= M){ 39 TARRAY [インデックス] = 配列[TI]。 40 TI ++;インデックス++ ; 41 } 42 } 43 44 のために(int型 K = iは、kは<= J; ++ kは) 45 配列[K] = TARRAY [K]。 46 47 リターン数えます。 48 } 49 50 INTのマージ(INT *配列、int型私は、INT J){ 51は / * * 52れる 時間だけつの要素*、0返し 53である 別の直接比較再帰呼び出し使用時iおよびjは隣接している場合* 54である * * / 55 (のprintf " \ N-D **%、Dの%" 、Iは、J); 56は、 IF(J == I)戻り 0 ; 57は、 IF(Iは、+ 1。 == J){ 58 IF(配列[I]> 配列[J] ){ 59 INT T = 配列[I]; 60 配列[I] = 配列[J]。 61は、ある 配列[J] = T; 62は リターン 1 ; 63である } そう 64 リターン 0 ; 65 } 66 67 / * * 68 :バイナリ再帰を使用して*、カウントの値は、3つの部分によって決定される 69 *逆順の各内部配列の周りに、そして左の列と 70 *右の子配列との間の逆。 71 *後の配列の周囲マージので、ソートされた 72 *パーティションは、(N)の時間複雑性Oで行うことができるが、 73 の追加のO(N)スペースの*必要な複雑 74 * * / 75 INT M = /(Iは、J +)2 。 76 int型のカウント= 0 ; 77 カウント+ = マージ(アレイ、I、M)。 78 カウント+ =マージ(アレイ、M + 1 、J); 79 カウント+ = パーティション(アレイ、I、J)。 80 81 リターン数えます。 82 } 83 84 INT メイン(){ 85 のint配列[] = { 7、2、1、4、3、5、6 }。 86 のprintf(" \ nは%D "、マージ(アレイ、0、6 ))。 87 88 リターン 0 ; 89 }
トピック:配列の長さn [0]、[1 ]、...、[N-1]。今[0]製品の[N-1]を[1]になり、すなわち、配列名要素を更新する、[1]になる[0]、[2] [N-1に】製品、...、[N-1 ] [0]製品の[N-2](つまり、現在の要素の除去であり、製品の他のすべての要素)に;
。 1)
。 2)
分析: [i]は前左要素商品の観点[i]は私を記憶するために、2つの左配列[N]と右[N]を作成し、右エレメント後の生成物は、[I]はIを記憶するので、左右初期化は、アレイの2つだけのスキャンを必要とする、時間複雑度は線形であり、分割は使用されません。
問題解決:
1つの 空隙転送(INT *配列、int型の長さ){ 2 のint leftarray [長さ]。 3 INT rightarray [長さ]。 4 5 leftarray [ 0 ] = 1 。 図6は、 のために(int型 i = 1 ; iは長さ<; iは++ ) 7 leftarray [I] = leftarray [I- 1 ] *配列[I- 1 ]。 8 9 rightarray [長さ- 1 ] = 1 。 10 のための(int型I =長さ- 2 ; I> - 1 ; i-- ) 11 rightarray [I] = rightarray [I + 1 ] *配列[I + 1 ]。 12 13の ために(int型 i = 0 ; iは長さ<; iは++ ) 14 配列[I] = leftarray [I] * rightarray [I]。 15 } 16 17 INT メイン(){ 18 のint配列[] = { 5、2、3、4 }。 19 int型の長さ= 4 。 20 転送(配列、長さ)。 21 のためには、(int型 = Iを0 ; iは長さ<; Iは++ ) 22 のprintf(" %dを、" 配列[I])。 23 リターン 0 ; 24 }
ます。https://www.cnblogs.com/leo-chen-2014/p/3749298.htmlで再現