diff --git a/MedianQuicksort.h b/MedianQuicksort.h new file mode 100644 index 0000000..f6f5ec8 --- /dev/null +++ b/MedianQuicksort.h @@ -0,0 +1,40 @@ +#pragma once + +int partition(std::vector& values, int left, int right) { + int pivotIndex = left + (right - left) / 2; + int pivotValue = values[pivotIndex]; + int i = left, j = right; + int temp; + while (i <= j) { + while (values[i] < pivotValue) { + i++; + } + while (values[j] > pivotValue) { + j--; + } + if (i <= j) { + temp = values[i]; + values[i] = values[j]; + values[j] = temp; + i++; + j--; + } + } + return i; +} + +void quicksort(std::vector& values, int left, int right) { + if (left < right) { + int pivotIndex = partition(values, left, right); + quicksort(values, left, pivotIndex - 1); + quicksort(values, pivotIndex, right); + } +} + +size_t getMedian(std::vector values) { + //std::qsort(numbers); // only takes array param + quicksort(values, 0, values.size() - 1); + size_t idxMed = values.size() / 2; + if (idxMed - (int)idxMed > 0) idxMed++; + return values[idxMed]; +} \ No newline at end of file diff --git a/main.cpp b/main.cpp index 2b20cf8..12cfae1 100644 --- a/main.cpp +++ b/main.cpp @@ -1,7 +1,9 @@ #include +#include // std::nth_element #include "fileHandler.h" #include "Timing.h" +#include "MedianQuicksort.h" int main(int argc, char** argv) { Timing::getInstance()->startRecord("init"); @@ -9,8 +11,19 @@ int main(int argc, char** argv) { std::cout << "read " << numbers.size() << " values" << std::endl; Timing::getInstance()->stopRecord("init"); - Timing::getInstance()->startRecord("test"); - Timing::getInstance()->stopRecord("test"); + // vollständige Sortierung mit Quicksort und Ausgabe des mittleren Elements + Timing::getInstance()->startRecord("quicksort"); + std::cout << "quicksort median: " << getMedian(numbers) << std::endl; + Timing::getInstance()->stopRecord("quicksort"); + + // Verwendung des C++ STL function templates nth_element + Timing::getInstance()->startRecord("nth element"); + std::nth_element(numbers.begin(), numbers.begin() + numbers.size() / 2, numbers.end()); + size_t idxMed = numbers.size() / 2; + if (idxMed - (int)idxMed > 0) idxMed++; + std::cout << "nth element: " << numbers[idxMed] << std::endl; + Timing::getInstance()->stopRecord("nth element"); + //Timing::getInstance()->getResults(); Timing::getInstance()->print(); return 0;