|
@@ -5,28 +5,38 @@
|
|
|
// Adapted from: Lysecky & Vahid "Data Structures Essentials", zyBooks
|
|
// Adapted from: Lysecky & Vahid "Data Structures Essentials", zyBooks
|
|
|
|
|
|
|
|
#include "mergesort.h"
|
|
#include "mergesort.h"
|
|
|
|
|
+#include <iostream>
|
|
|
|
|
+#include <cstdio>
|
|
|
|
|
|
|
|
-void MergeSort(std::vector<int>* numbers, int *comparisonCounter, int *memAccessCounter) {
|
|
|
|
|
- MergeSortRecurse(numbers, 0, numbers->size() - 1, comparisonCounter, memAccessCounter);
|
|
|
|
|
|
|
+int* MergeSort(std::vector<int>* numbers) {
|
|
|
|
|
+ int comparisonCounter = 0;
|
|
|
|
|
+ int memAccessCounter = 0;
|
|
|
|
|
+ static int returnCounters[2];
|
|
|
|
|
+
|
|
|
|
|
+ MergeSortRecurse(numbers, 0, numbers->size() - 1, &comparisonCounter, &memAccessCounter);
|
|
|
|
|
+
|
|
|
|
|
+ returnCounters[0] = comparisonCounter;
|
|
|
|
|
+ returnCounters[1] = memAccessCounter;
|
|
|
|
|
+ return returnCounters;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
-void MergeSortRecurse(std::vector<int>* numbers, int i, int k, int *comparisonCounter, int *memAccessCounter) {
|
|
|
|
|
|
|
+void MergeSortRecurse(std::vector<int>* numbers, int i, int k, int* comparisonCounterPointer, int* memAccessCounterPointer) {
|
|
|
int j = 0;
|
|
int j = 0;
|
|
|
|
|
|
|
|
if (i < k) {
|
|
if (i < k) {
|
|
|
j = (i + k) / 2; // Find the midpoint in the partition
|
|
j = (i + k) / 2; // Find the midpoint in the partition
|
|
|
|
|
|
|
|
// Recursively sort left and right partitions
|
|
// Recursively sort left and right partitions
|
|
|
- MergeSortRecurse(numbers, i, j, comparisonCounter, memAccessCounter);
|
|
|
|
|
- MergeSortRecurse(numbers, j + 1, k, comparisonCounter, memAccessCounter);
|
|
|
|
|
|
|
+ MergeSortRecurse(numbers, i, j, comparisonCounterPointer, memAccessCounterPointer);
|
|
|
|
|
+ MergeSortRecurse(numbers, j + 1, k, comparisonCounterPointer, memAccessCounterPointer);
|
|
|
|
|
|
|
|
// Merge left and right partition in sorted order
|
|
// Merge left and right partition in sorted order
|
|
|
- Merge(numbers, i, j, k, comparisonCounter, memAccessCounter);
|
|
|
|
|
|
|
+ Merge(numbers, i, j, k, comparisonCounterPointer, memAccessCounterPointer);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-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 mergedSize = k - i + 1; // Size of merged partition
|
|
|
int mergePos = 0; // Position to insert merged number
|
|
int mergePos = 0; // Position to insert merged number
|
|
|
int leftPos = 0; // Position of elements in left partition
|
|
int leftPos = 0; // Position of elements in left partition
|
|
@@ -43,13 +53,16 @@ void Merge(std::vector<int>* numbers, int i, int j, int k, int *comparisonCounte
|
|
|
if ((*numbers)[leftPos] < (*numbers)[rightPos]) {
|
|
if ((*numbers)[leftPos] < (*numbers)[rightPos]) {
|
|
|
*comparisonCounter++;
|
|
*comparisonCounter++;
|
|
|
*memAccessCounter = *memAccessCounter + 2;
|
|
*memAccessCounter = *memAccessCounter + 2;
|
|
|
|
|
+ //std::cout << ".." << std::endl;
|
|
|
mergedNumbers[mergePos] = (*numbers)[leftPos];
|
|
mergedNumbers[mergePos] = (*numbers)[leftPos];
|
|
|
*memAccessCounter++;
|
|
*memAccessCounter++;
|
|
|
|
|
+ //std::cout << "." << std::endl;
|
|
|
++leftPos;
|
|
++leftPos;
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
mergedNumbers[mergePos] = (*numbers)[rightPos];
|
|
mergedNumbers[mergePos] = (*numbers)[rightPos];
|
|
|
*memAccessCounter++;
|
|
*memAccessCounter++;
|
|
|
|
|
+ //std::cout << "." << std::endl;
|
|
|
++rightPos;
|
|
++rightPos;
|
|
|
|
|
|
|
|
}
|
|
}
|
|
@@ -60,6 +73,7 @@ void Merge(std::vector<int>* numbers, int i, int j, int k, int *comparisonCounte
|
|
|
while (leftPos <= j) {
|
|
while (leftPos <= j) {
|
|
|
mergedNumbers[mergePos] = (*numbers)[leftPos];
|
|
mergedNumbers[mergePos] = (*numbers)[leftPos];
|
|
|
*memAccessCounter++;
|
|
*memAccessCounter++;
|
|
|
|
|
+ //std::cout << "." << std::endl;
|
|
|
++leftPos;
|
|
++leftPos;
|
|
|
++mergePos;
|
|
++mergePos;
|
|
|
}
|
|
}
|
|
@@ -68,6 +82,7 @@ void Merge(std::vector<int>* numbers, int i, int j, int k, int *comparisonCounte
|
|
|
while (rightPos <= k) {
|
|
while (rightPos <= k) {
|
|
|
mergedNumbers[mergePos] = (*numbers)[rightPos];
|
|
mergedNumbers[mergePos] = (*numbers)[rightPos];
|
|
|
*memAccessCounter++;
|
|
*memAccessCounter++;
|
|
|
|
|
+ //std::cout << "." << std::endl;
|
|
|
++rightPos;
|
|
++rightPos;
|
|
|
++mergePos;
|
|
++mergePos;
|
|
|
}
|
|
}
|
|
@@ -76,5 +91,6 @@ void Merge(std::vector<int>* numbers, int i, int j, int k, int *comparisonCounte
|
|
|
for (mergePos = 0; mergePos < mergedSize; ++mergePos) {
|
|
for (mergePos = 0; mergePos < mergedSize; ++mergePos) {
|
|
|
(*numbers)[i + mergePos] = mergedNumbers[mergePos];
|
|
(*numbers)[i + mergePos] = mergedNumbers[mergePos];
|
|
|
*memAccessCounter++;
|
|
*memAccessCounter++;
|
|
|
|
|
+ //std::cout << "." << std::endl;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|