-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy path1089.cpp
More file actions
70 lines (62 loc) · 2.04 KB
/
1089.cpp
File metadata and controls
70 lines (62 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool equal(vector<int> &v1, vector<int> &v2) {
return equal(v1.begin(), v1.end(), v2.begin(), v2.end());
}
void print(vector<int> &v) {
for (int i = 0; i < v.size(); i++)
cout << v[i] << (i < v.size() - 1 ? ' ' : '\n');
}
void insert_iterate(vector<int> &v, int pos) {
for (int i = pos; i > 0; i--)
if (v[i-1] > v[i]) swap(v[i], v[i-1]);
}
bool insert_sort(vector<int> &init, vector<int> &part) {
vector<int> temp(init);
for (int i = 1; i < init.size(); i++) {
insert_iterate(temp, i);
if (equal(temp, part)) {
insert_iterate(temp, ++i);
cout << "Insertion Sort" << endl;
print(temp);
return true;
}
}
return false;
}
void merge(vector<int> &work, vector<int> &temp, int start1, int start2, int len) {
int i = start1, j = start2, index = start1, n = work.size();
while (i - start1 < len && j - start2 < len && i < n && j < n)
work[index++] = temp[i] < temp[j] ? temp[i++] : temp[j++];
while (i - start1 < len && i < n) work[index++] = temp[i++];
while (j - start2 < len && j < n) work[index++] = temp[j++];
}
void merge_iterate(vector<int> &work, vector<int> &temp, int len) {
copy(work.begin(), work.end(), temp.begin());
for (int i = 0; i < work.size(); i += 2 * len)
merge(work, temp, i, i + len, len);
}
bool merge_sort(vector<int> &init, vector<int> &part) {
vector<int> work(init), temp(init);
for (int len = 1; len < init.size(); len *= 2) {
merge_iterate(work, temp, len);
if (equal(work, part)) {
merge_iterate(work, temp, len *= 2);
cout << "Merge Sort" << endl;
print(work);
return true;
}
}
return false;
}
int main() {
int n;
cin >> n;
vector<int> init(n), part(n);
for (int i = 0; i < n; i++) cin >> init[i];
for (int i = 0; i < n; i++) cin >> part[i];
if (!insert_sort(init, part)) merge_sort(init, part);
return 0;
}