|
|
@@ -21,22 +21,22 @@ int* MergeSort(std::vector<int>* numbers) {
|
|
|
}
|
|
|
|
|
|
|
|
|
-void MergeSortRecurse(std::vector<int>* numbers, int i, int k, int* comparisonCounterPointer, int* memAccessCounterPointer) {
|
|
|
+void MergeSortRecurse(std::vector<int>* numbers, int i, int k, int *comparisonCounter, int *memAccessCounter) {
|
|
|
int j = 0;
|
|
|
|
|
|
if (i < k) {
|
|
|
j = (i + k) / 2; // Find the midpoint in the partition
|
|
|
|
|
|
// Recursively sort left and right partitions
|
|
|
- MergeSortRecurse(numbers, i, j, comparisonCounterPointer, memAccessCounterPointer);
|
|
|
- MergeSortRecurse(numbers, j + 1, k, comparisonCounterPointer, memAccessCounterPointer);
|
|
|
+ MergeSortRecurse(numbers, i, j, comparisonCounter, memAccessCounter);
|
|
|
+ MergeSortRecurse(numbers, j + 1, k, comparisonCounter, memAccessCounter);
|
|
|
|
|
|
// Merge left and right partition in sorted order
|
|
|
- Merge(numbers, i, j, k, comparisonCounterPointer, memAccessCounterPointer);
|
|
|
+ Merge(numbers, i, j, k, comparisonCounter, memAccessCounter);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void Merge(std::vector<int>* numbers, int i, int j, int k, int* comparisonCounter, int* memAccessCounter) {
|
|
|
+void Merge(std::vector<int>* numbers, int i, int j, int k, int *comparisonCounter, int *memAccessCounter) {
|
|
|
int mergedSize = k - i + 1; // Size of merged partition
|
|
|
int mergePos = 0; // Position to insert merged number
|
|
|
int leftPos = 0; // Position of elements in left partition
|
|
|
@@ -51,18 +51,15 @@ void Merge(std::vector<int>* numbers, int i, int j, int k, int* comparisonCounte
|
|
|
// Add smallest element from left or right partition to merged numbers
|
|
|
while (leftPos <= j && rightPos <= k) {
|
|
|
if ((*numbers)[leftPos] < (*numbers)[rightPos]) {
|
|
|
- *comparisonCounter++;
|
|
|
+ *comparisonCounter = *comparisonCounter + 1;
|
|
|
*memAccessCounter = *memAccessCounter + 2;
|
|
|
- //std::cout << ".." << std::endl;
|
|
|
mergedNumbers[mergePos] = (*numbers)[leftPos];
|
|
|
- *memAccessCounter++;
|
|
|
- //std::cout << "." << std::endl;
|
|
|
+ *memAccessCounter = *memAccessCounter + 1;
|
|
|
++leftPos;
|
|
|
}
|
|
|
else {
|
|
|
mergedNumbers[mergePos] = (*numbers)[rightPos];
|
|
|
- *memAccessCounter++;
|
|
|
- //std::cout << "." << std::endl;
|
|
|
+ *memAccessCounter = *memAccessCounter + 1;
|
|
|
++rightPos;
|
|
|
|
|
|
}
|
|
|
@@ -72,8 +69,7 @@ void Merge(std::vector<int>* numbers, int i, int j, int k, int* comparisonCounte
|
|
|
// If left partition is not empty, add remaining elements to merged numbers
|
|
|
while (leftPos <= j) {
|
|
|
mergedNumbers[mergePos] = (*numbers)[leftPos];
|
|
|
- *memAccessCounter++;
|
|
|
- //std::cout << "." << std::endl;
|
|
|
+ *memAccessCounter = *memAccessCounter + 1;
|
|
|
++leftPos;
|
|
|
++mergePos;
|
|
|
}
|
|
|
@@ -81,8 +77,7 @@ void Merge(std::vector<int>* numbers, int i, int j, int k, int* comparisonCounte
|
|
|
// If right partition is not empty, add remaining elements to merged numbers
|
|
|
while (rightPos <= k) {
|
|
|
mergedNumbers[mergePos] = (*numbers)[rightPos];
|
|
|
- *memAccessCounter++;
|
|
|
- //std::cout << "." << std::endl;
|
|
|
+ *memAccessCounter = *memAccessCounter + 1;
|
|
|
++rightPos;
|
|
|
++mergePos;
|
|
|
}
|
|
|
@@ -90,7 +85,6 @@ void Merge(std::vector<int>* numbers, int i, int j, int k, int* comparisonCounte
|
|
|
// Copy merge number back to numbers
|
|
|
for (mergePos = 0; mergePos < mergedSize; ++mergePos) {
|
|
|
(*numbers)[i + mergePos] = mergedNumbers[mergePos];
|
|
|
- *memAccessCounter++;
|
|
|
- //std::cout << "." << std::endl;
|
|
|
+ *memAccessCounter = *memAccessCounter + 1;
|
|
|
}
|
|
|
}
|