7-273 插入排序还是归并排序 (25 分)

简介: 7-273 插入排序还是归并排序 (25 分)

7-273 插入排序还是归并排序 (25 分)


根据维基百科的定义:


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


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


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


输入格式:


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


输出格式:


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


输入样例 1:


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


结尾无空行


输出样例 1:


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


结尾无空行


输入样例 2:


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


结尾无空行


输出样例 2:


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


#include <bits/stdc++.h>
//将插入和归并排序的所有中间序列记录下来,然后进行查找
#define mem(a) memset(a, 0, sizeof(a))
using namespace std;
int tmp[101], ori[101], mid[101], ins[100][101], meg[10][101];
int n, cnts = 0, cntm = 0;
int youxu()
{
    for (int i = 2; i <= n; i++)
    {
        if (ori[i] < ori[i - 1])
            return 0;
    }
    return 1;
}
int cmp(int a[], int b[]) //比较是否相同
{
    for (int i = 1; i <= n; i++)
    {
        if (a[i] != b[i])
            return 0;
    }
    return 1;
}
void printarr(int a[])
{
    for (int i = 1; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    printf("%d\n", a[n]);
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> ori[i];
        tmp[i] = ori[i];
    }
    for (int i = 1; i <= n; i++)
    {
        cin >> mid[i];
    }
    for (int k = 0;; k++) //产生插入排序的序列
    {
        if (youxu())
            break;
        int pos = 0;
        for (int i = 2; i <= n; i++)
        {
            if (ori[i] < ori[i - 1])
            {
                pos = i;
                break;
            }
        }
        if (!pos)
            break;
        cnts++;
        ori[0] = ori[pos]; //临时保存pos位置的数字
        while (ori[pos - 1] > ori[0] && pos>1)
        {
            ori[pos] = ori[pos - 1];
            pos--;
        }
        ori[pos] = ori[0];
        for (int i = 1; i <= n; i++)
            ins[k][i] = ori[i];
    }
    for (int i = 1; i <= n; i++)
        ori[i] = tmp[i]; //还原ori
    for (int k = 0;; k++) //产生归并排序的序列
    {
        int m = pow(2, k + 1);
        if (youxu())
            break;
        cntm++;
        for (int i = 1; i <= n; i += m)
        {
            int e = i + m;
            if (i + m > n + 1)
                e = n + 1;
            sort(ori + i, ori + e);
        }
        for (int i = 1; i <= n; i++)
        {
            meg[k][i] = ori[i];
        }
    }
    int flag = 0;
    for (int i = 0; i < cntm; i++)
    {
        if (cmp(meg[i], mid))
        {
            flag = 1;
            cout<<"Merge Sort"<<endl;
            //printf("Merge Sort\n");
            printarr(meg[i + 1]);
            break;
        }
    }
    if (!flag)
    {
        for (int i = 0; i < cnts; i++)
        {
            if (cmp(ins[i], mid))
            {
                printf("Insertion Sort\n");
                printarr(ins[i + 1]);
                break;
            }
        }
    }
    return 0;
}
目录
相关文章
|
5月前
|
算法 搜索推荐 大数据
【算法】排序——归并排序和计数排序
上两篇文章讲解了插入排序、选择排序以及交换排序,每种类型的排序大类下都有一到两种排序,今天给大家带来的是归并排序,和前面几种排序一样都属于比较排序中的一种,是通过比较数组中的元素来实现排序的,还给大家带来一种非比较排序计数排序,让我们开始今天的排序之吧!!!
|
10月前
|
人工智能 算法
【归并排序】归并排序/逆序对的数量
【归并排序】归并排序/逆序对的数量
|
5月前
|
算法
【算法】排序——选择排序和交换排序(快速排序)
上篇文章讲述了插入排序及插入排序的优化希尔排序,今天我们继续给大家带来排序中的选择排序和交换排序,选择排序包括直接选择排序、 其中还包括堆排序,因为之前讲过堆排序,这篇文章就不多讲解,点击直达堆排序。交换排序包括冒泡排序、快速排序。让我们开始今天的选择排序之旅吧!!!
|
6月前
|
机器学习/深度学习 算法 搜索推荐
【算法】六大排序 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序
【算法】六大排序 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序
|
7月前
|
存储 搜索推荐 算法
七大排序 (9000字详解直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)
七大排序 (9000字详解直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)
73 0
|
10月前
|
人工智能 算法 搜索推荐
数据排序汇总二(希尔排序、快速排序、归并排序)
数据排序汇总二(希尔排序、快速排序、归并排序)
|
10月前
|
搜索推荐 算法
八大排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(上)2
八大排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(上)2
|
10月前
|
搜索推荐 算法 Shell
八大排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(上)1
八大排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(上)1
|
11月前
|
存储 人工智能 搜索推荐
【排序算法(三)】交换排序(冒泡排序&&快速排序)(上)
【排序算法(三)】交换排序(冒泡排序&&快速排序)(上)
|
11月前
|
搜索推荐 算法
【排序算法(三)】交换排序(冒泡排序&&快速排序)(下)
【排序算法(三)】交换排序(冒泡排序&&快速排序)(下)