1035 插入与归并

久未见 提交于 2019-11-27 22:06:02
/**
 * 1.解题思路:
 * 
 * 2.参考博客:
 */
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int n, a[100], b[100], i, j;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    for (int i = 0; i < n; i++)
        cin >> b[i];
    //将i指向中间序列中满足从左到右是从小到大顺序的最后一个下标
    for (i = 0; i < n - 1 && b[i] <= b[i + 1]; i++);
    //将j指向从i+1开始,第一个不满足a[j] == b[j]的下标
    //如果j顺利到达了下标n,说明是插入排序
    for (j = i + 1; a[j] == b[j] && j < n; j++);
    if (j == n) {
        cout << "Insertion Sort" << endl;
        //下一次的序列是sort(a, a+i+2)
        sort(a, a + i + 2);
    } else {
        //模拟归并
        cout << "Merge Sort" << endl;
        int k = 1, flag = 1;
        while(flag) {
            //找到与中间归并过程相同的序列状态
            flag = 0;
            for (i = 0; i < n; i++) {
                //当a[i]与b[i]完全相等时,则认为到达了指定的输入的中间状态
                if (a[i] != b[i])
                    flag = 1;
            }
            k = k * 2;
            //
            for (i = 0; i < n / k; i++)
                sort(a + i * k, a + (i + 1) * k);
            sort(a + n / k * k, a + n);
        }
    }
    //输出下一次排序状态
    for (j = 0; j < n; j++) {
        if (j != 0) printf(" ");
        printf("%d", a[j]);
    }
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!