• 1035 插入与归并


    根据维基百科的定义:

    插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

    归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。

    现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

    输入格式:

    输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

    输出格式:

    首先在第 1 行中输出Insertion Sort表示插入排序、或Merge Sort表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。

    输入样例 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
    
     
    思路:根据定义,插入排序是每一步对一个元素进行排序,由此我们可以用STL的sort对原始序列模拟出每一步插入排序,同时跟所给出的中间序列进行比较,可以自己写个函数或者用equal()函数比较,如果找到中间序列,那么就是插入排序,再进行一轮插入排序输出即可,但是如果最后还是没有找到中间序列,那么就是归并排序,注意这里有个坑点就是要重新对原始序列进行归并排序的模拟,否则如果对中间序列模拟归并排序的下一步会错一个点......
     
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<cstdio>
     5 #include<algorithm>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 using namespace std;
    10 #define ll long long 
    11 #define inf 99999999
    12 int n;
    13 bool compare(int start[],int mid[])
    14 {
    15     int flag=0;
    16     for(int i=0;i<n;i++)
    17     {
    18         if(start[i]!=mid[i])
    19         {
    20             flag=1;
    21             break;
    22         }
    23     }
    24     if(flag==1)
    25         return false;
    26     else
    27         return true;
    28 }
    29 int main()
    30 {
    31     scanf("%d",&n);
    32     int start[101];//原始序列 
    33     int start1[101];//保存原始序列 
    34     int mid[101];//中间序列
    35     for(int i=0;i<n;i++)
    36     {
    37         scanf("%d",&start[i]);
    38         start1[i]=start[i];
    39     }
    40     for(int i=0;i<n;i++)
    41         scanf("%d",&mid[i]);
    42     
    43     int flag=0;//记录是否为插入排序 
    44     for(int i=1;i<n;i++)
    45     {
    46         sort(start,start+i+1);//进行一轮插入排序 
    47         //第一轮插入排序是排前两个数,等i轮插入排序则是排前i+1个数 
    48         if(compare(start,mid)==true)
    49         {
    50             flag=1;
    51             sort(start,start+i+2);//进行下一轮插入排序 
    52             break; 
    53         }
    54     }
    55     if(flag)//为插入排序 
    56     {
    57         printf("Insertion Sort
    ");
    58         for(int i=0;i<n;i++)
    59         i==n-1?printf("%d
    ",start[i]):printf("%d ",start[i]);
    60         return 0;
    61     }
    62         flag=0;
    63         for(int k=2;k<=n;k*=2)
    64         {
    65             int count=n/k;
    66             for(int i=0;i<count;i++)
    67                 sort(start1+i*k,start1+(i+1)*k);    //模拟归并排序
    68             sort(start1+count*k,start1+n);     //注意剩余部分也要排序
    69             if(flag==1)//输出已经归并排序一步的序列
    70             {
    71                 for(int i=0;i<n;i++)
    72                     i==n-1?printf("%d
    ",start1[i]):printf("%d ",start1[i]);
    73                 return 0;
    74             }
    75             if(compare(start1,mid)==true)//找到中间序列,判断为归并排序,刷新flag
    76             {
    77                 printf("Merge Sort
    ");
    78                 flag=1;
    79             }
    80         }
    81     return 0;
    82 }
    大佬见笑,,
  • 相关阅读:
    深入了解Struts2返回JSON数据的原理及具体应用范例
    Struts国际化
    LeetCode Balanced Binary Tree
    LeetCode Triangle
    Binary Tree Level Order Traversal
    Pow(x,n)
    Symmetric Tree
    LeetCode Word Search
    LeetCode Insert Interval
    Maximum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/xwl3109377858/p/10473514.html
Copyright © 2020-2023  润新知