-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMergeSort3Way.cpp
More file actions
127 lines (105 loc) · 2.88 KB
/
MergeSort3Way.cpp
File metadata and controls
127 lines (105 loc) · 2.88 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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <cstdio> // Provides printf()
#include <cstdlib> // Provides size_t
#include <vector> // Provides vector or dynamic array
#include <climits> // Provides INT_MAX
#include <algorithm> // Provides swap()
using namespace std;
// Helper functions to test out sorting algos
vector<int> generateRandom(size_t length = 10, size_t min = 1, size_t max = 100);
bool isSorted(const vector<int>& V);
void print(const vector<int>& V);
void mergeSort(vector<int>& V);
void merge(const vector<int>& first, const vector<int>& second, const vector<int>& third, vector<int>& V);
int main() {
// Generate N random numbers
const int N = 1e1;
printf("Original:\n");
vector<int> V = generateRandom(N);
print(V);
// Test merge sort
printf("Merge Sort:\n");
mergeSort(V);
print(V);
printf("%s\n", isSorted(V) ? "Successful!" : "Unsuccessful :(");
return 0;
// // Testing merge function
// vector<int> F = {1,1,1,1,2,3,4,5};
// vector<int> S = {2,4,6};
// vector<int> T = {1,2,3,23,34};
// vector<int> output;
// merge(F, S, T, output);
// print(output);
}
void mergeSort(vector<int>& V) {
if (V.size() <= 1) {
return;
}
if (V.size() == 2) {
if (V[0] > V[1]) {
swap(V[0], V[1]);
}
return;
}
// Splicing vector into thirds using iterator constructor
const size_t THIRD = V.size() / 3;
vector<int> first(V.begin(), V.begin() + THIRD);
vector<int> second(V.begin() + THIRD, V.begin() + 2 * THIRD);
vector<int> third(V.begin() + 2 * THIRD, V.end());
mergeSort(first);
mergeSort(second);
mergeSort(third);
merge(first, second, third, V);
}
void merge(const vector<int>& first, const vector<int>& second, const vector<int>& third, vector<int>& V) {
const size_t FIRST = first.size();
const size_t SECOND = second.size();
const size_t THIRD = third.size();
V.resize(FIRST + SECOND + THIRD);
size_t i = 0, j = 0, k = 0;
bool iempty = false, jempty = false, kempty = false;
size_t min = INT_MAX;
size_t* minIndex = &i;
for (size_t index = 0; index < V.size(); ++index) {
// If empty, don't find the minimum of that number
// Find the minimum of 3/2/1 numbers
// Add the minimum into the array
if (i >= FIRST)
iempty = true;
if (j >= SECOND)
jempty = true;
if (k >= THIRD)
kempty = true;
if (!iempty && first[i] < min) {
min = first[i];
minIndex = &i;
}
if (!jempty && second[j] < min) {
min = second[j];
minIndex = &j;
}
if (!kempty && third[k] < min) {
min = third[k];
minIndex = &k;
}
V[index] = min;
(*minIndex)++;
min = INT_MAX;
}
}
vector<int> generateRandom(size_t length, size_t min, size_t max) {
vector<int> V(length);
for (size_t i = 0; i < length; ++i)
V[i] = rand() % max + min;
return V;
}
bool isSorted(const vector<int>& V) {
for (size_t i = 1; i < V.size(); ++i)
if (V[i] < V[i - 1])
return false;
return true;
}
void print(const vector<int>& V) {
for (int i : V)
printf("%i ", i);
printf("\n");
}