7-16ソートを挿入するか、ソートを集計するか(25分)

8784 ワード

タイトルリンク:https://pintia.cn/problem-sets/1110537862649819136/problems/1110537981575114767
テーマ:
ウィキペディアの定義によると:
挿入ソートは反復アルゴリズムであり,入力データを1つずつ取得し,秩序ある出力シーケンスを逐次生成する.各ステップ反復では、アルゴリズムは入力シーケンスから要素を取り出し、秩序化シーケンスの正しい位置に挿入します.このように、すべての要素が整列するまで反復します.
集計ソートは、まず、元のシーケンスをN個の要素のみを含む整列サブシーケンスと見なし、次いで、最後に1個の整列サブシーケンスのみが残るまで、2つの隣接する整列サブシーケンスを反復ごとに集計する反復操作を行う.
元のシーケンスとソートアルゴリズムによって生成された中間シーケンスを指定します.このアルゴリズムはいったいどのソートアルゴリズムなのか判断してください.

入力形式:


入力は、1行目に正の整数N(≦100)を与える.次の行は、元のシーケンスのN個の整数を与える.最後の行は、あるソートアルゴリズムによって生成された中間シーケンスを与える.ここでは、ソートのターゲットシーケンスが昇順であると仮定します.数字の間はスペースで区切られています.

出力フォーマット:


まず、1行目の出力Insertion Sortが挿入ソートを示し、またはMerge Sortが集計ソートを示す.そして、2行目に、このソートアルゴリズムでさらに1ラウンド反復した結果シーケンスを出力する.問題は各グループのテストの結果が唯一であることを保証します.数値間はスペースで区切られており、行の先頭と末尾に余分なスペースがないようにしてください.
具体的な考え方:
挿入ソートを判断する際には,どの位置がインクリメントされていないかを判断し,この点の後ろの配列と元の配列が同じかを判断することで,前の部分は既に並んでいるが,後ろの配列は並んでいないと理解できる.
そして集計ソートの場合、このソートの思想は分治の思想に似ていて、各小段を並べて、それからまとめて並べます.最初は2つ2つで、それから4つで、このような状況です.この問題については,まず元の配列から操作を行い,b配列のStepがどれだけあるかを見てからStep*2,さらに順番を並べて,もう一歩の感覚で直接出力すればよい.
ACコード:
 1 #include
 2 using namespace std;
 3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 const int maxn = 2e5+100;
 6 int a[maxn];
 7 int b[maxn];
 8 int n;
 9 bool judge(int t){
10 for(int i=0;i){
11 if(a[i]!=b[i])return false;
12 }
13 return true;
14 }
15 int main(){
16 scanf("%d",&n);
17 for(int i=0;i){
18 scanf("%d",&a[i]);
19 }
20 for(int j=0;j){
21 scanf("%d",&b[j]);
22 }
23 int i,j;
24 for( i=1;i=b[i-1];i++);
25 for( j=i;j);
26 if(j==n){
27 printf("Insertion Sort
"); 28 sort(b,b+i+1,n)); 29 for(int i=0;i){ 30 if(i==0)printf("%d",b[i]); 31 else printf(" %d",b[i]); 32 } 33 printf("
"); 34 return 0; 35 } 36 printf("Merge Sort
"); 37 i=2; 38 for(;!judge(i);i+=i){ 39 for(int j=0;ji,n)); 40 } 41 for(int j=0;ji,n)); 42 for(int i=0;i){ 43 if(i==0)printf("%d",a[i]); 44 else printf(" %d",a[i]); 45 } 46 printf("
"); 47 return 0; 48 }

 
転載先:https://www.cnblogs.com/letlifestop/p/10616198.html