首页 > 代码库 > PAT1089
PAT1089
好坑啊,考试的时候因为一个1分的点卡了很长时间,D题都没有看。
坑点在于,直到变化为止,再把这个数组打出来。另外还考察了基本排序算法,merge sort这大概是我第一次写iteration版本,越写越顺,也算是一件好事,insert sort真的是卡了很久,基本功不行,寒假回去看算法书的时候这些算法都用JAVA写一遍吧
1 #include <fstream> 2 #include <iostream> 3 #include <vector> 4 #include <algorithm> 5 6 using namespace std; 7 8 //#define OJ 9 10 #ifdef OJ 11 #define fin cin 12 #else 13 ifstream fin("in.txt"); 14 #endif 15 16 vector<int> merge_vec; 17 vector<int> insert_vec; 18 vector<int> target; 19 vector<int> input; 20 int n; 21 22 #define MAX 0x70000000 23 24 int merge_sublist; 25 int merge_num; 26 int insert_i; 27 28 bool merge_sort(){ 29 int sublist = n; 30 int num = 1; 31 bool found = false; 32 33 while (sublist != 1){ 34 int list_cnt = 0; 35 for (int i = 0; i < sublist; i += 2){ 36 list_cnt++; 37 vector<int> s1, s2; 38 int s1_start = i * num; 39 int s1_end = s1_start + num > n ? n : s1_start + num; 40 int s2_start = s1_end; 41 int s2_end = s2_start + num > n ? n : s2_start + num; 42 int idx = i * num; 43 44 int cnt = 0; 45 while (idx < n && cnt++ < num){ 46 s1.push_back(merge_vec[idx]); 47 idx++; 48 } 49 cnt = 0; 50 while (idx < n && cnt++ < num){ 51 s2.push_back(merge_vec[idx]); 52 idx++; 53 } 54 55 vector<int> tmp; 56 int p1 = s1_start, p2 = s2_start; 57 while (p1 != s1_end || p2 != s2_end){ 58 int v1 = p1 == s1_end ? 0x70000000 : merge_vec[p1]; 59 int v2 = p2 == s2_end ? 0x70000000 : merge_vec[p2]; 60 61 if (v1 < v2){ 62 tmp.push_back(v1); 63 p1++; 64 } 65 else { 66 tmp.push_back(v2); 67 p2++; 68 } 69 } 70 71 for (int i = s1_start; i < s2_end; i++) 72 merge_vec[i] = tmp[i - s1_start]; 73 } 74 sublist = list_cnt; 75 num *= 2; 76 bool flag = true; 77 for (int i = 0; i < n; i++){ 78 if (target[i] != merge_vec[i]){ 79 flag = false; 80 break; 81 } 82 } 83 if (flag){ 84 found = true; 85 merge_sublist = sublist; 86 merge_num = num; 87 } 88 if (found && !flag){ 89 return true; 90 } 91 } 92 return false; 93 } 94 95 bool insert_sort(){ 96 bool found = false; 97 for (int i = 0; i < n; i++){ 98 int j = 0; 99 for (; j < i; j++){100 if (insert_vec[j] > insert_vec[i])101 break;102 }103 int swap_num = insert_vec[i];104 for (int k = i; k > j; k--){105 insert_vec[k] = insert_vec[k - 1];106 }107 insert_vec[j] = swap_num;108 109 bool flag = true;110 for (int i = 0; i < n; i++){111 if (insert_vec[i] != target[i]){112 flag = false;113 break;114 }115 }116 if (flag){117 insert_i = i + 1;118 found = true;119 }120 if (found && !flag){121 return true;122 }123 }124 125 return false;126 }127 128 int main(){129 fin >> n;130 131 target.resize(n);132 input.resize(n);133 134 for (int i = 0; i < n; i++){135 fin >> input[i];136 }137 for (int i = 0; i < n; i++){138 fin >> target[i];139 }140 141 merge_vec = input;142 bool res = merge_sort();143 144 if (res){145 cout << "Merge Sort" << endl;146 cout << merge_vec[0];147 for (int i = 1; i < n; i++){148 cout << " " << merge_vec[i];149 }150 cout << endl;151 return 0;152 }153 154 insert_vec = input;155 res = insert_sort();156 157 if (res){158 cout << "Insertion Sort" << endl;159 cout << insert_vec[0];160 for (int i = 1; i < n; i++){161 cout << " " << insert_vec[i];162 }163 cout << endl;164 return 0;165 }166 167 168 return 0;169 }
PAT1089
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。