The file to test threading on
This commit is contained in:
149
main.cpp
Normal file
149
main.cpp
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <chrono>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <thread>
|
||||||
|
#include <fstream>
|
||||||
|
#define ARR_LEN 45'000
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
void merge(int array[], int const left, int const mid,
|
||||||
|
int const right)
|
||||||
|
{
|
||||||
|
int const subArrayOne = mid - left + 1;
|
||||||
|
int const subArrayTwo = right - mid;
|
||||||
|
|
||||||
|
// Create temp arrays
|
||||||
|
auto *leftArray = new int[subArrayOne],
|
||||||
|
*rightArray = new int[subArrayTwo];
|
||||||
|
|
||||||
|
// Copy data to temp arrays leftArray[] and rightArray[]
|
||||||
|
for (auto i = 0; i < subArrayOne; i++)
|
||||||
|
leftArray[i] = array[left + i];
|
||||||
|
for (auto j = 0; j < subArrayTwo; j++)
|
||||||
|
rightArray[j] = array[mid + 1 + j];
|
||||||
|
|
||||||
|
auto indexOfSubArrayOne = 0, indexOfSubArrayTwo = 0;
|
||||||
|
int indexOfMergedArray = left;
|
||||||
|
|
||||||
|
// Merge the temp arrays back into array[left..right]
|
||||||
|
while (indexOfSubArrayOne < subArrayOne
|
||||||
|
&& indexOfSubArrayTwo < subArrayTwo) {
|
||||||
|
if (leftArray[indexOfSubArrayOne]
|
||||||
|
<= rightArray[indexOfSubArrayTwo]) {
|
||||||
|
array[indexOfMergedArray]
|
||||||
|
= leftArray[indexOfSubArrayOne];
|
||||||
|
indexOfSubArrayOne++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
array[indexOfMergedArray]
|
||||||
|
= rightArray[indexOfSubArrayTwo];
|
||||||
|
indexOfSubArrayTwo++;
|
||||||
|
}
|
||||||
|
indexOfMergedArray++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the remaining elements of
|
||||||
|
// left[], if there are any
|
||||||
|
while (indexOfSubArrayOne < subArrayOne) {
|
||||||
|
array[indexOfMergedArray]
|
||||||
|
= leftArray[indexOfSubArrayOne];
|
||||||
|
indexOfSubArrayOne++;
|
||||||
|
indexOfMergedArray++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the remaining elements of
|
||||||
|
// right[], if there are any
|
||||||
|
while (indexOfSubArrayTwo < subArrayTwo) {
|
||||||
|
array[indexOfMergedArray]
|
||||||
|
= rightArray[indexOfSubArrayTwo];
|
||||||
|
indexOfSubArrayTwo++;
|
||||||
|
indexOfMergedArray++;
|
||||||
|
}
|
||||||
|
delete[] leftArray;
|
||||||
|
delete[] rightArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
// begin is for left index and end is right index
|
||||||
|
// of the sub-array of arr to be sorted
|
||||||
|
void mergeSort(int array[], int const begin, int const end)
|
||||||
|
{
|
||||||
|
if (begin >= end)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int mid = begin + (end - begin) / 2;
|
||||||
|
mergeSort(array, begin, mid);
|
||||||
|
mergeSort(array, mid + 1, end);
|
||||||
|
merge(array, begin, mid, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void bubbleSort(int arr[], int n)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
bool swapped;
|
||||||
|
for (i = 0; i < n - 1; i++) {
|
||||||
|
swapped = false;
|
||||||
|
for (j = 0; j < n - i - 1; j++) {
|
||||||
|
if (arr[j] > arr[j + 1]) {
|
||||||
|
swap(arr[j], arr[j + 1]);
|
||||||
|
swapped = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no two elements were swapped
|
||||||
|
// by inner loop, then break
|
||||||
|
if (!swapped)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
using std::chrono::high_resolution_clock;
|
||||||
|
using std::chrono::duration_cast;
|
||||||
|
using std::chrono::duration;
|
||||||
|
using std::chrono::milliseconds;
|
||||||
|
srand(time(nullptr));
|
||||||
|
|
||||||
|
|
||||||
|
int nums1[ARR_LEN];
|
||||||
|
int (*p1)[ARR_LEN] = &nums1;
|
||||||
|
int nums2[ARR_LEN];
|
||||||
|
|
||||||
|
for(int & i : nums1) {
|
||||||
|
i = (int) rand() % 750 + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
copy(nums1, nums1+ARR_LEN, nums2);
|
||||||
|
|
||||||
|
auto total1 = high_resolution_clock ::now();
|
||||||
|
|
||||||
|
auto t1 = high_resolution_clock::now();
|
||||||
|
bubbleSort(nums1, ARR_LEN);
|
||||||
|
// mergeSort(nums1, 0, sizeof(nums1) / sizeof(nums1[0]));
|
||||||
|
// thread merge (mergeSort, nums1, 0, sizeof(nums1) / sizeof(nums1[0]));
|
||||||
|
auto t2 = high_resolution_clock::now();
|
||||||
|
|
||||||
|
|
||||||
|
auto t3 = high_resolution_clock ::now();
|
||||||
|
bubbleSort(nums2, ARR_LEN);
|
||||||
|
// thread bubble (bubbleSort, nums2, ARR_LEN);
|
||||||
|
auto t4 = high_resolution_clock ::now();
|
||||||
|
|
||||||
|
// thread bubble2(bubbleSort, nums1, 0);
|
||||||
|
|
||||||
|
|
||||||
|
// bubble2.join();
|
||||||
|
// bubble.join();
|
||||||
|
auto total2 = high_resolution_clock::now();
|
||||||
|
|
||||||
|
auto ms1 = duration<double, std::milli>(t2-t1);
|
||||||
|
auto ms2 = duration<double, std::milli>(t4-t3);
|
||||||
|
auto total_time = duration<double, std::milli>(total2-total1);
|
||||||
|
cout << "Merge sort took: "<< ms1.count() << "ms" << endl;
|
||||||
|
cout << "Bubble sort took: " << ms2.count() << "ms" << endl;
|
||||||
|
cout << "Total time: " << total_time.count() << "ms" << endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user