题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040

注意点

  1. 说难不难说简单不简单,不光考察了插入和归并排序,主要是循环的设置和函数返回
  2. 初试序列不能参与比较
  3. 注意一下归并排序的步长问题
  1. for(int step = 2; step / 2 < n; step *= 2){
  2. if(step != 2 && isSame(temp_list,list2)) flag = true;
  3. for(int i = 0; i < n; i += step) sort(temp_list.begin() + i, temp_list.begin() + min(i + step, n));
  4. }

代码

  1. #include<vector>
  2. #include<algorithm>
  3. #include<iostream>
  4. using namespace std;
  5. vector<int> list1, temp_list,list2;
  6. int n;
  7. bool isSame(vector<int> A, vector<int> B){
  8. int len = max(A.size(),B.size());
  9. for(int i = 0; i < len; i++){
  10. if(A[i] != B[i]) return false;
  11. }
  12. return true;
  13. }
  14. void showArr(vector<int> A){
  15. int len = A.size();
  16. for(int i = 0; i < len; i++){
  17. printf("%d",A[i]);
  18. if(i != len-1) printf(" ");
  19. }
  20. printf("\n");
  21. }
  22. bool Insertion_Sort(){
  23. bool flag = false;
  24. for(int i = 1; i < n; i++){
  25. if(i!=1&&isSame(temp_list,list2)) flag = true;
  26. int min = i;
  27. while(min>=1&&temp_list[min-1]>temp_list[min]){
  28. swap(temp_list[min-1],temp_list[min]);
  29. min--;
  30. }
  31. if(flag) return true;
  32. }
  33. return false;
  34. }
  35. void Merge_Sort(){
  36. bool flag = false;
  37. for(int step = 2; step / 2 < n; step *= 2){
  38. if(step != 2 && isSame(temp_list,list2)) flag = true;
  39. for(int i = 0; i < n; i += step) sort(temp_list.begin() + i, temp_list.begin() + min(i + step, n));
  40. if(flag){
  41. showArr(temp_list);
  42. return;
  43. }
  44. }
  45. }
  46. int main(){
  47. scanf("%d",&n);
  48. list1.resize(n),list2.resize(n);
  49. for(int i = 0; i < n; i++) scanf("%d",&list1[i]);
  50. temp_list = list1;
  51. for(int i = 0; i < n; i++) scanf("%d",&list2[i]);
  52. if(Insertion_Sort()){
  53. printf("Insertion Sort\n");
  54. showArr(temp_list);
  55. }
  56. else{
  57. temp_list = list1;
  58. printf("Merge Sort\n");
  59. Merge_Sort();
  60. }
  61. }