の非再帰的なアルゴリズムのマージソート

オリジナルリンク: http://www.cnblogs.com/arcfat/archive/2012/12/06/2805701.html

8645マージソート(非再帰的アルゴリズム)

制限時間:1000msのメモリ制限:1000K

質問:プログラミング言語のタイトル:無制限

 

説明

結果は、関数でマージソート(非再帰的アルゴリズム)を達成し、ソートあたりの旅行を出力します

 

入力

最初のライン:キーボード入力のキー数nソートする
第二列:ソートするn番目の入力キー、スペースで区切られたデータを

出力

データ間のスペースで区切っトリップごとにソートされた出力結果の各行、

 

サンプル入力

10 
5 4 8 0 9 3 2 6 7 1

 

サンプル出力

4 5 0 8 3 9 2 6 1 7 
0 4 5 8 2 3 6 9 1 7 
0 2 3 4 5 6 8 9 1 7 
0 1 2 3 4 5 6 7 8 9

 

//以下のコードACです

書式#include <iostreamの>
名前空間stdを使用。

プロセスボイド(N-INT);
ボイドマージ(ORI INT []、INT N-);
ボイドnewMerge(ORI INT []、INT tmpArray []、int型のS、N-INT); //関数を用いて、マージを完了する時間がありません2つのソート配列の隣接するマージ
ボイドマージ(INT ORI []、 INT tmpArray []、、、INT半ばを左から右int型INT); // 配列の2つの行をマージtmpArrayに分類される
(ボイド出力INTオペアンプ[]、int型N) ; // 出力アレイの

メインINT()
{
  int型のn;
  cinを>> N;
  工程(N)
  0を返します。
}

プロセスボイド(N-INT)
{
  ; [N- + 1] ORI int型
  のための(INT I = 1; I <= N - 、Iは++)
    CIN >> ORI [I]は、
  IF(N> 1)//もし複数マージし、ランク付けする要素
    マージ(ORI、n)を; //元のマージを呼び出す
  ほか
    、出力(ORI、N-)
}

マージボイド(ORI INT []、INT N-)
{
  int型= S. 1、tmpArray [N- + 1]; // Sが各方法は、2つのアレイ、アレイ(S未満持続することができる配列の長さ)をマージする時間の長さであり
  、一方(S <N-)
  {
    newMerge(ORI、tmpArray、S、N-);
    S = 2 *;
  }
}

newMergeボイド(ORI INT []、INT tmpArray []、INT S、N-INT)
{
  //隣接する2つのソート配列が合流して、この関数をマージを完了しない場合
  、私は= int型1;
  ながら(私は< = N - 2 * S + 1 )//は、 1 <= N導出することができる-私は2Sを+使う
  {
    、I 2 * S + 1 - -マージ(ORI、tmpArray、I、S I + 1);
    I = + S※2;
  }
  IF(I <= N - S)//すなわち、不十分な長さSの背面の最後の2つの
    マージ(ORI、tmpArray、I、I S + - 1、N-);
  他//それは[]内に、端部に複数のだけ不十分長さを統合し、単にtmpArrayに直接コピーされる
    ため(; I <= N - 、Iは++)
      tmpArray [I] = ORI [I];

  //これが完了しますトリップマージ
  //再びここで壁紙を符号化するために[] ORIコピー
  のために(INT = 0 K; K <= N; ++ K)
    ORI [K] = tmpArray [K];

  出力(ORI、N-);
}

マージボイド(ORI INT []、INT tmpArray []、左INT、MIDをINT、右INT)
{
  //配列のマージ二列のコピーに戻り、次いでtmpArray []にソートされ、ORI []の
  INT tmpCnt =左; //一時カウンタ
  INT rightStart =ミッド+ 1; // MIDが実際leftEnd
  一方(左<= MID && Rightstart <=右)
  {
    IF(ORI [左] <= ORI [Rightstart])
      tmpArray [tmpCnt ++] = ORI【左++];
    他
      tmpArray [tmpCnt ++] = ORI [Rightstart ++];
  }
  //誰以下にtmpArray []の中に直接入れ複数
  一方(左<= MID)
    tmpArray [tmpCnt ++] = ORI [左++ ];

  一方(Rightstart <=右)
    tmpArray [tmpCnt ++] = ORI [Rightstart ++];

}

ボイド出力(OP []、INT nを整数)
{
  ための(I = 1をint型; ++ I; iが<= N)
  COUT << OP [I] << "「。
  coutの<<てendl;
}

ます。https://www.cnblogs.com/arcfat/archive/2012/12/06/2805701.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_30703911/article/details/94789594