1089挿入またはマージ(25分)

ウィキペディアによると:

挿入ソートの反復処理し、各反復1つの入力要素を消費し、ソートされた出力リストを成長させること。各反復は、挿入ソート入力データから一つの要素を削除し、それがソートされたリスト内に属する場所、およびそこに挿入があると認めます。何の入力要素が残っていないまで、それは繰り返されます。

マージソートのように動作する次のN個のサブリストにソートされていないリストを分割し、それぞれを含む1つの要素(1つの要素のリストがソートされたと見なされます)。そして、繰り返し、残りの1つだけのサブリストがあるまで新しいソートサブリストを生成するために2つの隣接するサブリストをマージします。

今、一緒にいくつかのソート方法のいくつかの繰り返しの結果であるシーケンスで、整数の初期シーケンスを与え、あなたは私たちが使っている方法を並べ替えている伝えることができますか?

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、整数陽性を与える  N(≤)。そして、次の行では、  N個の整数は最初のシーケンスとして与えられています。最後の行は、一部のソート順が含ま  N番号を。標的配列が常に昇順であるとします。行のすべての数字は、スペースで区切られます。

出力仕様:

各テストケースのために、部分的な結果を得るために使用される方法を示すために、最初の行のいずれかで「ソート挿入」または「マージソート」で印刷します。そして、2行目の1回の以上の繰り返しと出力resulingシーケンスのために、この方法を実行します。答えは各テストケースに対して一意であることが保証されています。行のすべての数字は、スペースで区切る必要があり、ラインの末尾に余分なスペースがあってはなりません。

サンプル入力1:

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

サンプル出力1:

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

サンプル入力2:

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

出力例2:

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


  1  の#define _CRT_SECURE_NO_WARNINGS  
   2の#include <stdio.hの>
   3の#include < malloc関数 .H>
   4の#include <STDLIB.H>
   5  INT A [ 110 ]。
  6  int型 B [ 110 ]。
  7  int型L;
  8  ボイドプリント(INT N)
   9  {
 10      INT I。
11      のためには、式(I = 0、I <N - 1 ; I ++ 12          のprintf(" %dを"、B [I])。
13      のprintf(" %dの" 、B [I])。
14  }
 15  INT IsOrder(int型 B []、INT LO、INT HI)
 16  {
 17      のためにINT I = 1.0; I <HI - 1 ; I ++ 18          であれば(B [i]が> B [I + 1 ])
 19              リターン 0 ;
20      リターン 1 21  }
 22  のint ChargeLength(INT B []、INTN、int型の長さ)   // 配列長の長さにチェック
23は {
 24      INT Iは、
 25      のために(私は= 0 ; I <N-長; = I + 長さ)が
 26である         IF!(IsOrder(B、I、I + 長さ))
 27              リターン 0 ;
 28      IF(I < N)
 29          IF(!IsOrder(B、I、N))
 30              リターン 0 ;
 31である      L = 、長さ
 32      リターン 1 ;
 33である }
 34が INT電荷(int型 B []、INT N)
 35  {
 36      int型の長さ= 2 37      一方(長さ<= N)
 38      {
 39          であれば(ChargeLength(B、N、長さ))
 40              長さ* = 2 ;
41          
42              であれば(長さ> 2 43                  リターン 1 44              他の
45                  の戻り 0 ;
46      }
 47  }
 48  
49  のボイドInsert_Once(int型 B []、int型 iは、整数N)の
 50  {
 51      のint J。
52      int型温度= B [i]は、
53      のために(J = I、J> 0 && B [j - 1 ]>温度; j-- 54          B [j] = B [j - 1 ]。
55      B [J] = 温度。
56  }
 57  
58  空隙マージ(INT LO、INT MI、INT HI)
 59  {
 60      INT * B1 =(INT *)はmallocはsizeofint型)*(MI - LO));
61      のためにINT iは= 0を B1 [I] = B [LO +、 - 、I ++ LO I <MI)I]。
62      int型I、J、K。
63      I = LO。
64      J = 0 65      K = MI。
66      一方(J <MI - LO)
 67      {
 68          であれば(K> = HI || B1 [j]が<= B [K])B [I ++] = B1 [J ++ ]。
69          もし(K <HI && B1 [J]> B [K])B [I ++] = B [K ++ ]。
70      }
 71      フリー(B1)。
72  }
 73  空隙 Merge_Once(int型 B []、int型の長さ、INT N)
 74  {
 75      INT I。
76      のためには、式(I = 0、I <N - 2 *長さ、I + = 2 * 長さ)
 77          マージ(I、I +長さ、I + 2 * 長さ)。
78      もし(I +長さ< N)
 79          マージ(I、I + 長さ、N)。
80  }
 81 
82  のint main()の
 83  {
 84      INT N。
85      INTフラグ= 0 86      INT OrderPosition = 0 87      のscanf(" %dの"、&N)。
88      のためにINTは iが= 0を I ++; I <N 89          のscanf(" %dの"、&A [I])。
90      のためにINTは iが= 0を I ++; I <N 91          (のscanf" %のD "、&B [I]);
 92      IF(のフラグ= チャージ(B、N))
 93          のprintf(" マージソート\ N- " );
 94      他の
95          のprintf(" 挿入ソート\ N- " );
 96      INT Iは= 0 ; I <N - 1。 ; I ++ 97          IF([I + B [I] <= B 1 ])      // 以上が存在しなければならない
98              OrderPosition = I + 。1 ;
 99          そう
100             休憩;
101      であれば(フラグ)
 102          Merge_Once(B、L、N)。
103      そう
104          Insert_Once(B、OrderPosition + 1 、N)。
105      プリント(N)。
106      戻り 0 ;
107 }
コードの表示

おすすめ

転載: www.cnblogs.com/57one/p/12071413.html