目录
1,题目描述
- consuming:强烈的; 重要的; 耗费(燃料、能量、时间等); 吃; 喝; 饮; 使充满(强烈的感情);
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
题目描述
根据给出的原始序列和部分排序的序列,判断是什么排序方法,并输出下一步排序结果。
注意
- 真正的归并排序,是类似于树的DFS遍历(左边部分排序,右边部分排序,两者合并作为新的左边部分,再继续下去),而题目中的“一步”是类似于从底向上的层次遍历(每一步,就把当前层次的所有小区间内的数进行排序);以题目中的例子为例(带颜色的为每“一步”中改动的部分):
- memcpy(dest,source,size):将数组source复制给数组dest,size表示数组source的大小;(来自大神@日沉云起【pat甲级1089 Insert or Merge (25)、乙级1035 插入与归并(25)】)
- equal(beg1,end1,beg2):比较两个序列对应位置上的元素是否相等,相等则返回true;否则返回false。beg1,end1,beg2均为迭代器,[beg1,end1]确定了序列1的首尾区间,beg2确定了序列2的起始位置;
2,思路
参考@日沉云起【pat甲级1089 Insert or Merge (25)、乙级1035 插入与归并(25)】
- 将原始序列init拷贝到A中,对A进行操作;
- 模拟插入排序:每次对前i个元素排序(i从1开始,即排序元素数目从2开始),若与tar数组匹配成功,则再进行一步:
- 模拟归并排序:(严格意义上来说,这并不是归并排序,而是利用归并的思想,进行的排序)按照区间长度2,4,8……进行排序
3,AC代码
代码简洁,逻辑清晰!再膜大神@日沉云起!
#include<bits/stdc++.h>
using namespace std;
int N, A[102], init[102], tar[102];
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
scanf("%d", &N);
for(int i = 0; i < N; i++)
scanf("%d", &init[i]);
for(int i = 0; i < N; i++)
scanf("%d", &tar[i]);
memcpy(A, init, sizeof(init)); //拷贝数组
bool flag = false;
for(int i = 1; i < N; i++){
sort(A, A + i + 1); //sort时不包括末尾A+i+1
if(equal(A, A + N, tar)){ //比较时是比较全部数字A + N
flag = true; //不要写成==
printf("Insertion Sort\n");
sort(A, A + i + 2);
break;
}
}
if(!flag){
memcpy(A, init, sizeof(init)); //拷贝数组
printf("Merge Sort\n");
for(int i = 2; i < N; i *= 2){ //每次排序的小区间扩大一倍
for(int j = 0; j < N; j += i)
sort(A + j, i+j>N ? A+N : A+i+j); //666!!!
if(equal(A, A + N, tar)){
for(int j = 0; j < N; j += 2 * i)
sort(A + j, j+2*i>N ? A+N : A+j+2*i); //666!!!
break;
}
}
}
printf("%d", A[0]);
for(int i = 1; i < N; i++)
printf(" %d", A[i]);
return 0;
}
4,解题过程
第一搏
本想着自己模拟一遍插入排序和归并排序,但是,,,感觉太繁琐了,上网请教大神!果然还是有很多的黑科技的(●ˇ∀ˇ●)
- memcpy(dest,source,size):将数组source复制给数组dest,size表示数组source的大小
- equal(beg1,end1,beg2):比较两个序列对应位置上的元素是否相等,相等则返回true;否则返回false。beg1,end1,beg2均为迭代器,[beg1,end1]确定了序列1的首尾区间,beg2确定了序列2的起始位置