A1089 Insert or Merge (25 分)

一、技术总结

  1. 看到是一个two pointers问题,核心是要理解插入排序和归并排序的实现原理,然后判断最后实现
  2. 可以知道a数组和b数组怎么样判断是插入排序还是归并排序,因为插入排序是来一个排一个,所以知道当发现有位置当前数比后面大时,进而再判断后面的每一位是否啊a、b数组都相等,如果是那么就是插入排序,再在后面进行一轮排序即可。如果不是就是归并排序。最主要的问题是判断归并排序到哪一轮了,使用while循环模拟归并排序,对数组a进行归并排序,直到与数组b相等,再进行一轮排序就是输出结果了。

二、参考代码

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int a[100], b[100], i, j, n;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    for(int i = 0; i < n; i++){
        cin >> b[i];
    }
    for(i = 0; i < n-1 && b[i] <= b[i+1]; i++);
    for(j = i+1; j < n && a[j] == b[j]; j++);
    if(j == n){
        printf("Insertion Sort\n");
        sort(a, a+i+2);
    }else{
        printf("Merge Sort\n");
        int flag = 1, k = 1;
        while(flag){
            flag = 0;
            for(i = 0; i < n; 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(" ");
        }
        cout << a[j];
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/tsruixi/p/11882338.html