#include <iostream> #include <vector> #include <memory> #include <algorithm> #include <chrono>
class SortStrategy { public: virtual ~SortStrategy() = default; virtual void sort(std::vector<int>& data) = 0; virtual std::string getName() const = 0; };
class QuickSortStrategy : public SortStrategy { private: void quickSort(std::vector<int>& arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } }
int partition(std::vector<int>& arr, int low, int high) { int pivot = arr[high]; int i = (low - 1);
for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; std::swap(arr[i], arr[j]); } } std::swap(arr[i + 1], arr[high]); return (i + 1); }
public: void sort(std::vector<int>& data) override { if (!data.empty()) { quickSort(data, 0, data.size() - 1); } }
std::string getName() const override { return "Quick Sort"; } };
class MergeSortStrategy : public SortStrategy { private: void mergeSort(std::vector<int>& arr, int left, int right) { if (left < right) { int mid = left + (right - left) / 2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, right); } }
void merge(std::vector<int>& arr, int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid;
std::vector<int> leftArr(n1), rightArr(n2);
for (int i = 0; i < n1; i++) leftArr[i] = arr[left + i]; for (int j = 0; j < n2; j++) rightArr[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) { if (leftArr[i] <= rightArr[j]) { arr[k] = leftArr[i]; i++; } else { arr[k] = rightArr[j]; j++; } k++; }
while (i < n1) { arr[k] = leftArr[i]; i++; k++; }
while (j < n2) { arr[k] = rightArr[j]; j++; k++; } }
public: void sort(std::vector<int>& data) override { if (!data.empty()) { mergeSort(data, 0, data.size() - 1); } }
std::string getName() const override { return "Merge Sort"; } };
class STLSortStrategy : public SortStrategy { public: void sort(std::vector<int>& data) override { std::sort(data.begin(), data.end()); }
std::string getName() const override { return "STL Sort"; } };
class Sorter { private: std::shared_ptr<SortStrategy> strategy_;
public: void setStrategy(std::shared_ptr<SortStrategy> strategy) { strategy_ = strategy; }
void performSort(std::vector<int>& data) { if (!strategy_) { std::cout << "No sorting strategy selected!" << std::endl; return; }
auto start = std::chrono::high_resolution_clock::now(); strategy_->sort(data); auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start); std::cout << strategy_->getName() << " completed in " << duration.count() << " microseconds" << std::endl; } };
|