From 68ce4f7887856a554d6d2528c3c6c30ff07452ae Mon Sep 17 00:00:00 2001 From: incredibleLeitman Date: Tue, 6 Oct 2020 17:43:20 +0200 Subject: [PATCH] handling only for odd datasets; added quicksort for array --- main.cpp | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/main.cpp b/main.cpp index 161ff81..0bd083f 100644 --- a/main.cpp +++ b/main.cpp @@ -14,16 +14,42 @@ int main(int argc, char** argv) { 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; + // index of median + if (numbers.size() % 2 == 0) + { + std::cout << "TODO: define how to handly even datasets" << std::endl; + return 1; + } + + size_t idxMed = (numbers.size() - 1) / 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: " << getQuicksortMedian(numbers, idxMed) << std::endl; + //std::cout << "quicksort median: " << getQuicksortMedian(numbers, idxMed) << std::endl; Timing::getInstance()->stopRecord("quicksort"); + // using std quicksort for array + // TODO: decide how the fuck to create a dynamic size array from vector... + //size_t* array = new size_t[numbers.size]; // create and fill new array + //size_t* array = &numbers[0]; // just a pointer to first element as array + //size_t* array[numbers.size()]; // invalid c++ -> non-constant expression! + //std::copy(numbers.begin(), numbers.end(), array); + //size_t* tmp = numbers.data(); // c++11 returns pointer to first elem + size_t* array = new size_t[999999]; // create and fill new array + std::copy(numbers.begin(), numbers.end(), array); + Timing::getInstance()->startRecord("array quicksort"); + std::qsort(array, numbers.size(), sizeof(size_t), [](const void* a, const void* b) + { + size_t arg1 = *static_cast(a); + size_t arg2 = *static_cast(b); + if (arg1 < arg2) return -1; + if (arg1 > arg2) return 1; + return 0; + }); + std::cout << "array quicksort median: " << array[idxMed] << std::endl; + Timing::getInstance()->stopRecord("array quicksort"); + // vorgestellter Randomzized - Select rekursiv implementiert Timing::getInstance()->startRecord("randomized select"); std::cout << "randomized select: " << randomizedSelect(numbers, 0, numbers.size() - 1, idxMed) << std::endl;