1089 Insert or Merge (25分) ★★★

点击前往【PAT甲级之路总纲】

题目

1089 Insert or Merge (25分) ★★★_第1张图片Sample Input 1:

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

Sample Output 1:

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

Sample Input 2:

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

Sample Output 2:

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

分析

插入排序:
分块排序:很有意思k*2思路,要点多多,十分有趣
排序一些技巧
注意分部的时候:i < n/k

要点

知识点

题解

判断是插入排序还是合并排序,并返回下一次操作后的值

#include 
#include 
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]; ///部分排序数组
    for (i = 0; i < n - 1 && b[i] <= b[i + 1]; i++); ///获取部分排序数组的有序部分
    for (j = i + 1; a[j] == b[j] && j < n; j++); ///判断无序部分相同的位置
    if (j == n) { ///与数组长度相同
        cout << "Insertion Sort" << endl; ///插入排序
        sort(a, a + i + 2);  ///左开右闭,返回下一次排序的结果,即排序到 i+1位置
    } else {
        cout << "Merge Sort" << endl; ///合并排序
        int k = 1, flag = 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来代劳
            sort(a + n / k * k, a + n);
        }
    }
    for (j = 0; j < n; j++) {
        if (j != 0) printf(" ");
        printf("%d", a[j]);
    }
    return 0;
}

你可能感兴趣的:(#,PAT,数据结构与算法)