1089. Insert or Merge (25)解题报告
2016-12-28 14:03
435 查看
每排序一步就比较一次。姥姥有更好的办法。但是我比较笨,喜欢简单而又粗暴的方法。其实相同的题目在乙级里面做过……
#include <iostream> #include <cstdio> #include <cstdlib> #define N 1000 bool cmp(int arr1[], int arr2[], int n); void merge(int arr1[], int num, int cnt, int start); bool mergesort(int arr1[], int arr2[], int num); bool insertsort(int arr1[], int arr2[], int num); int main(int argc, char** argv) { int arr1 , arr2 , arr3 , num, i; scanf("%d", &num); for(i = 0; i < num; i++){ scanf("%d", &arr1[i]); arr2[i] = arr1[i]; } for(i = 0; i < num; i++){ scanf("%d", &arr3[i]); } if(insertsort(arr1, arr3, num)){ puts("Insertion Sort"); printf("%d", arr1[0]); for(i = 1; i < num; i++){ printf(" %d", arr1[i]); } putchar('\n'); } else{ mergesort(arr2, arr3, num); puts("Merge Sort"); printf("%d", arr2[0]); for(i = 1; i < num; i++){ printf(" %d", arr2[i]); } putchar('\n'); } return 0; } bool cmp(int arr1[], int arr2[], int n){ int i; for(i = 0; i < n; i++){ if(arr1[i] != arr2[i]){ return false; } } return true; } void merge(int arr1[], int num, int cnt, int start){ int i, j, k, arr2 ; i = start; j = i + cnt; k = 0; while(i < start + cnt && j < start + 2 * cnt && j < num){ if(arr1[i] > arr1[j]){ arr2[k++] = arr1[j++]; } else{ arr2[k++] = arr1[i++]; } } while(i < start + cnt && i < num){ arr2[k++] = arr1[i++]; } while(j < start + 2 * cnt && j < num){ arr2[k++] = arr1[j++]; } for(i = 0; i < k; i++){ arr1[start + i] = arr2[i]; } return; } bool mergesort(int arr1[], int arr2[], int num){ int cnt = 1, i; bool flag = false; while(cnt < num && !flag){ for(i = 0; i < num; i += 2 * cnt){ merge(arr1, num, cnt, i); } cnt *= 2; flag = cmp(arr1, arr2, num); } for(i = 0; i < num && flag; i += 2 * cnt){ merge(arr1, num, cnt, i); } return flag; } bool insertsort(int arr1[], int arr2[], int num){ int i, j, tmp; bool flag = false; for(i = 1; i < num && !flag; i++){ tmp = arr1[i]; for(j = i - 1; j >= 0; j--){ if(arr1[j] < tmp){ break; } else{ arr1[j + 1] = arr1[j]; } } arr1[j + 1] = tmp; flag = cmp(arr1, arr2, num); } tmp = arr1[i]; for(j = i - 1; j >= 0 && flag; j--){ if(arr1[j] < tmp){ break; } else{ arr1[j + 1] = arr1[j]; } } arr1[j + 1] = tmp; return flag; }
相关文章推荐
- 1075. PAT Judge (25)解题报告
- 1093. Count PAT's (25)解题报告
- 1101. Quick Sort (25)解题报告
- 1110. Complete Binary Tree (25)解题报告
- PAT 解题报告 1007. Maximum Subsequence Sum (25)
- PAT 解题报告 1051. Pop Sequence (25)
- PAT (Advanced Level) 1036. Boys vs Girls (25) 解题报告
- 1094. The Largest Generation (25)解题报告
- 【解题报告】【浙大PAT】03-树1. List Leaves (25)
- 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总
- UESTC Summer Training #25解题报告
- PAT 1025 反转链表 (25) 解题报告
- PAT 解题报告 1009. Product of Polynomials (25)
- PAT 解题报告 1052. Linked List Sorting (25)
- PAT (Advanced Level) 1037. Magic Coupon (25) 解题报告
- leetcode解题报告(25):Reverse Words in a String III
- PAT 解题报告 1010. Radix (25)
- PAT (Advanced Level) 1006. Sign In and Sign Out (25) 解题报告
- 1044. Shopping in Mars (25)解题报告
- PAT 解题报告 1013. Battle Over Cities (25)