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
|
#include <iostream>
#include <vector>
using std::vector;
using std::cin;
using std::cout;
//Merge two sorted sublist in arr.
// List 1 is from [start, mid)
// List 2 is from [mid, end)
void
merge(int arr[], int start, int mid, int end)
{
int i = start; // source idx in list 1
int j = mid; // source idx in list 2
int k = 0; // destination in ar2
/* create temp arrays */
int arr2size = end - start;
int *arr2 = new int[arr2size];
/*cout << "Start time ";
timing(); */
while (i < mid && j < end) {
if (arr[i] <= arr[j]) {
arr2[k++] = arr[i++];
} else {
arr2[k++] = arr[j++];
}
}
// The i side or the j side still have values left.
// Copy them in. Rather than trying to figure out which
// one must be copied, code it to copy both. To me, it's
// clearer that way. Only one of these while loops will
// actually execute.
while (j < end) {
arr2[k++] = arr[j++];
}
while (i < mid) {
arr2[k++] = arr[i++];
}
// Now copy the values from arr2 back into arr
for (k=0; k<arr2size; ++k) {
arr[start+k] = arr2[k];
}
delete[] arr2;
}
//merge sort values in arr in the interval [i,j)
void
mergeSort(int arr[], int i, int j)
{
if (i+1 < j) { // if there are 2 or more values
int mid = (i + j) / 2;
mergeSort(arr, i, mid);
mergeSort(arr, mid, j);
merge(arr, i, mid, j);
}
}
int main()
{
vector<int> vec;
int val;
while (cin >> val) {
vec.push_back(val);
}
mergeSort(&vec[0], 0, vec.size());
for (auto v: vec) {
cout << v << ' ';
}
cout << '\n';
}
|