原题链接
分析:插入/归并排序 都可以用sort来解决
每次都是从头排到尾 只是每次步长step不同
AC代码
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 110; int n; int origin[maxn], temp[maxn], changed[maxn]; //原始序列 复制临时序列 排序数列 void showarray(int origin[]) { for(int i = 1; i <= n; i++) { cout << origin[i]; if( i < n) cout << " "; } } bool issame(int A[], int B[]) { for(int i = 1; i <= n; i++) { if(A[i] != B[i]) { return false; } } return true; } int k; //记录已排序的最后一个位置 bool InsertSort() { bool flag = false; for(int i = 2; i <= n; i++) { sort(origin + 1, origin + i + 1); if(!flag && issame(origin, changed)) { flag = true; k = i; break; } } sort(origin + 1, origin + k + 2); if(flag) return true; else return false; } void mergeSort(int (&A)[maxn]) //其实每次都是从头排到尾只不过是步长不一样 { int sstep,j;//记录步长 for(int step = 2; step / 2 <= n; step *= 2) { for(int i = 1; i <= n; i += step)//对每组进行排序 { sort(A + i, A + min(i + step, n + 1)); } if(issame(A, changed)) { j = step; break; } } sstep = j * 2; for(int i = 1; i <= n; i += sstep)//对每组进行排序 { sort(A + i, A + min(i + sstep, n + 1)); } } int main() { cin >> n; for(int i = 1; i <= n; i++) { cin >> origin[i]; temp[i] = origin[i]; } for(int i = 1; i <= n; i++) { cin >> changed[i]; } if(InsertSort()) { cout << "Insertion Sort" << endl; showarray(origin); } else { cout << "Merge Sort" << endl; mergeSort(temp); showarray(temp); } return 0; }