PAT basic 1035

xiaoxiao2021-02-28  54

#include <iostream> #include <algorithm> using namespace std; int cmp(int a, int b) { return a < b; } int main() { int n; cin >> n; int *a = new int [n]; int *b = new int [n]; for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { cin >> b[i]; } int i, j; 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, cmp); } else { cout << "Merge Sort" << endl; int k = 1; int 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, cmp); //归并排序的方法 sort(a + n / k * k, a + n, cmp); //归并最后的几个数字 有时候数目不够 不成一组 } } for (j = 0; j < n - 1; j++) { cout << a[j] << " "; } cout << a[n - 1]; delete [] a; delete [] b; return 0; } /* 分析:一开始第三个测试点一直不过, 天真的我以为可以模拟一遍归并的过程 然后在过程中判断下一步是什么。。 然而真正的归并算法它是一个递归过程。。 也就是先排左边一半,把左边的完全排列成 正确的顺序之后,再排右边一半的。。而不是 左右两边一起排列的。。后来改了自己的归并部分 判断的代码就过了。。。 */
转载请注明原文地址: https://www.6miu.com/read-83242.html

最新回复(0)