根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入格式:
输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。
输出格式:
首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。
输入样例1:
10 3 1 2 8 7 5 9 4 6 0 1 2 3 7 8 5 9 4 6 0
输出样例1:
Insertion Sort 1 2 3 5 7 8 9 4 6 0
输入样例2:
10 3 1 2 8 7 5 9 4 0 6 1 3 2 8 5 7 4 9 0 6
输出样例2:
Merge Sort 1 2 3 8 4 5 7 9 0 6 判断排序方法:以2为块,判断各块内是否有序。因为解是唯一的,如果满足各块内均有序,那么肯定可以是归并排序的一步!反之如果存在某块内无序,则必然是插入排序对于插入排序,只需要找出不合理的位置pos,再从0-pos位开始sort一下,可以直接使用sort函数或者手动模拟一下对于归并排序,首先需要找出最大的块Gap(1,2,4,8..)满足各块内均有序,然后再将各(2*Gap)块内的数据排序(任意排序方法);归并排序需要注意最后不满(2*Gap)的部分的处理
#include <bits/stdc++.h> #define LL long long #define MAXN 100+50 using namespace std; int n; int arrNotSorted[MAXN]; int arrSorted[MAXN]; bool insertFlag = false; bool cmp(const int &a, const int &b){ return a < b; } int main(){ scanf("%d", &n); for(int i = 0; i < n; ++i){ scanf("%d", &arrNotSorted[i]); } for(int i = 0; i < n; ++i){ scanf("%d", &arrSorted[i]); } for(int i = 0; i < n; i += 2){ if(i+1 < n){ if(arrSorted[i] > arrSorted[i+1]){ insertFlag = true; } } } if(insertFlag){ //insert printf("Insertion Sort\n"); int pos; for(pos = 0; pos < n-1; pos++){ if(arrSorted[pos] > arrSorted[pos+1]){ break; } } pos++; int val = arrSorted[pos]; //justify pos for(int i = 0; i < pos; ++i){ if(arrSorted[i] > arrSorted[pos]){ // i->i+1 ...pos for(int j = pos; j > i; --j){ arrSorted[j] = arrSorted[j-1]; } arrSorted[i] = val; break; } } for(int i = 0; i < n; ++i){ if(i == 0){ printf("%d", arrSorted[i]); } else{ printf(" %d", arrSorted[i]); } } } else{ printf("Merge Sort\n"); //merge int gap = 4; bool flag = true; while(1){ for(int t = 0; t < n/gap; ++t){ if(!flag){ break; } for(int i = 0; i < gap-1; ++i){ if(arrSorted[i+t*gap] > arrSorted[i+1+t*gap]){ flag = false; break; } } } if(!flag){ break; } gap *= 2; } for(int t = 0; t < n/gap; ++t){ sort(arrSorted+t*gap, arrSorted+(t+1)*gap, cmp); } if(n % gap != 0){ sort(arrSorted+n/gap*gap, arrSorted+n, cmp); } for(int i = 0; i < n; ++i){ if(i == 0){ printf("%d", arrSorted[i]); } else{ printf(" %d", arrSorted[i]); } } } return 0; }
CAPOUIS‘CODE
时间: 2024-11-05 16:43:02