アルゴリズム書かれた質問(32):&アレイに配列要素を変換する逆の順序のアルゴリズムをマージは、残りの他の要素の積であります...

トピック:エラーで別のジョブのバックよりも前にある人ならば、人々は、キューの前と後のローからハイへ順に配置されている。
  例:[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配列[] = { 7214356 }。
86          のprintf(" \ nは%D "、マージ(アレイ、06 ))。
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配列[] = { 5234 }。
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で再現

おすすめ

転載: blog.csdn.net/weixin_33912246/article/details/94232126