From f3688bbc7f03b3af6efc975a2f0c329263ad943d Mon Sep 17 00:00:00 2001 From: incredibleLeitman Date: Tue, 6 Oct 2020 16:28:39 +0200 Subject: [PATCH] using size_t (uint32) instead of int because only use positive values --- MedianQuicksort.h | 26 +++++++++++--------------- main.cpp | 30 +++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/MedianQuicksort.h b/MedianQuicksort.h index f6f5ec8..e743d19 100644 --- a/MedianQuicksort.h +++ b/MedianQuicksort.h @@ -1,10 +1,10 @@ #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; +size_t pivotPartition(std::vector& values, size_t left, size_t right) { + size_t pivotIndex = left + (right - left) / 2; + size_t pivotValue = values[pivotIndex]; + size_t i = left; + size_t j = right; while (i <= j) { while (values[i] < pivotValue) { i++; @@ -13,9 +13,7 @@ int partition(std::vector& values, int left, int right) { j--; } if (i <= j) { - temp = values[i]; - values[i] = values[j]; - values[j] = temp; + std::swap(values[i], values[j]); i++; j--; } @@ -23,18 +21,16 @@ int partition(std::vector& values, int left, int right) { return i; } -void quicksort(std::vector& values, int left, int right) { +void quicksort(std::vector& values, size_t left, size_t right) { if (left < right) { - int pivotIndex = partition(values, left, right); + size_t pivotIndex = pivotPartition(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 +size_t getQuicksortMedian(std::vector values, size_t i) { + //std::qsort(numbers); // only takes array param -> custom implementation with vector quicksort(values, 0, values.size() - 1); - size_t idxMed = values.size() / 2; - if (idxMed - (int)idxMed > 0) idxMed++; - return values[idxMed]; + return values[i]; } \ No newline at end of file diff --git a/main.cpp b/main.cpp index 12cfae1..161ff81 100644 --- a/main.cpp +++ b/main.cpp @@ -4,23 +4,43 @@ #include "fileHandler.h" #include "Timing.h" #include "MedianQuicksort.h" +#include "MedianOfMedians.h" +#include "RandomizedSelect.h" int main(int argc, char** argv) { + // read test values from input file Timing::getInstance()->startRecord("init"); std::vector numbers = readFromFile("testdata"); - std::cout << "read " << numbers.size() << " values" << std::endl; + std::cout << "just read " << numbers.size() << " values" << std::endl; Timing::getInstance()->stopRecord("init"); + // index of median -> if odd count +1 + size_t idxMed = numbers.size() / 2; + std::cout << "median = " << idxMed << std::endl; + if (idxMed - (int)idxMed > 0) idxMed++; + // vollständige Sortierung mit Quicksort und Ausgabe des mittleren Elements Timing::getInstance()->startRecord("quicksort"); - std::cout << "quicksort median: " << getMedian(numbers) << std::endl; + std::cout << "quicksort median: " << getQuicksortMedian(numbers, idxMed) << std::endl; Timing::getInstance()->stopRecord("quicksort"); + // vorgestellter Randomzized - Select rekursiv implementiert + Timing::getInstance()->startRecord("randomized select"); + std::cout << "randomized select: " << randomizedSelect(numbers, 0, numbers.size() - 1, idxMed) << std::endl; + Timing::getInstance()->stopRecord("randomized select"); + + // ein weiterer Median - Algorithmus aus der Literatur + Timing::getInstance()->startRecord("median of medians"); + std::cout << "median of medians: " << getMedianOfMedians(numbers, idxMed) << std::endl; + Timing::getInstance()->stopRecord("median of medians"); + + // noch ein ein weiterer Median - Algorithmus weil wir so cool sind + Timing::getInstance()->startRecord("wirth"); + Timing::getInstance()->stopRecord("wirth"); + // 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::nth_element(numbers.begin(), numbers.begin() + idxMed, numbers.end()); std::cout << "nth element: " << numbers[idxMed] << std::endl; Timing::getInstance()->stopRecord("nth element");