zoukankan      html  css  js  c++  java
  • PAT 1035 插入与归并(25)

    原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040传送门;

    根据维基百科的定义:

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

    归并排序:进行如下迭代操作:首先将原始序列看成 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模拟插入和归并排序
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;
    void insort(int a[], int b[]) {
        int key = 0;          //当匹配到中间序列时,key置1,下次排序后输出,结束程序就行
        for (int i = 2; i <= n; i++) {        //插入排序起始为2,结束为n,否则测试点2不通过
            sort(a, a + i);
            if (key) {
                cout << "Insertion Sort" << endl;
                cout << a[0];
                for (int j = 1; j < n; j++)
                    cout << " " << a[j];
                return;
            }
            if (equal(a, a + n, b))  //equal是一个比较数组的函数
                key = 1;
        }
    }
    void mesort(int a[], int b[]) {
        int key = 0;
        for (int i = 2;; i *= 2) {   //这里不给结束条件,是因为当i>n时还要进行一次排序
            for (int j = 0; j < n; j += i) {
                sort(a + j, a + (j + i < n ? j + i : n));  //注意确定边界
            }
            if (key) {
                cout << "Merge Sort" << endl;
                cout << a[0];
                for (int j = 1; j < n; j++)
                    cout << " " << a[j];
                return;
            }
            if (equal(a, a + n, b))
                key = 1;
            if (i > n)
                break;
     
        }
    }
    int main() {
        cin >> n;
        int a1[100], a2[100], b[100];
        for (int i = 0; i < n; i++) {
            cin >> a1[i];
            a2[i] = a1[i];
        }
        for (int i = 0; i < n; i++)
            cin >> b[i];
        insort(a2, b);
        mesort(a1, b);
        return 0;
    }
     
  • 相关阅读:
    1094. Car Pooling
    121. Best Time to Buy and Sell Stock
    58. Length of Last Word
    510. Inorder Successor in BST II
    198. House Robber
    57. Insert Interval
    15. 3Sum java solutions
    79. Word Search java solutions
    80. Remove Duplicates from Sorted Array II java solutions
    34. Search for a Range java solutions
  • 原文地址:https://www.cnblogs.com/lanclot-/p/10929344.html
Copyright © 2011-2022 走看看