using size_t (uint32) instead of int because only use positive values
This commit is contained in:
parent
1883659921
commit
f3688bbc7f
@ -1,10 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
int partition(std::vector<size_t>& values, int left, int right) {
|
size_t pivotPartition(std::vector<size_t>& values, size_t left, size_t right) {
|
||||||
int pivotIndex = left + (right - left) / 2;
|
size_t pivotIndex = left + (right - left) / 2;
|
||||||
int pivotValue = values[pivotIndex];
|
size_t pivotValue = values[pivotIndex];
|
||||||
int i = left, j = right;
|
size_t i = left;
|
||||||
int temp;
|
size_t j = right;
|
||||||
while (i <= j) {
|
while (i <= j) {
|
||||||
while (values[i] < pivotValue) {
|
while (values[i] < pivotValue) {
|
||||||
i++;
|
i++;
|
||||||
@ -13,9 +13,7 @@ int partition(std::vector<size_t>& values, int left, int right) {
|
|||||||
j--;
|
j--;
|
||||||
}
|
}
|
||||||
if (i <= j) {
|
if (i <= j) {
|
||||||
temp = values[i];
|
std::swap(values[i], values[j]);
|
||||||
values[i] = values[j];
|
|
||||||
values[j] = temp;
|
|
||||||
i++;
|
i++;
|
||||||
j--;
|
j--;
|
||||||
}
|
}
|
||||||
@ -23,18 +21,16 @@ int partition(std::vector<size_t>& values, int left, int right) {
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void quicksort(std::vector<size_t>& values, int left, int right) {
|
void quicksort(std::vector<size_t>& values, size_t left, size_t right) {
|
||||||
if (left < right) {
|
if (left < right) {
|
||||||
int pivotIndex = partition(values, left, right);
|
size_t pivotIndex = pivotPartition(values, left, right);
|
||||||
quicksort(values, left, pivotIndex - 1);
|
quicksort(values, left, pivotIndex - 1);
|
||||||
quicksort(values, pivotIndex, right);
|
quicksort(values, pivotIndex, right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t getMedian(std::vector<size_t> values) {
|
size_t getQuicksortMedian(std::vector<size_t> values, size_t i) {
|
||||||
//std::qsort(numbers); // only takes array param
|
//std::qsort(numbers); // only takes array param -> custom implementation with vector
|
||||||
quicksort(values, 0, values.size() - 1);
|
quicksort(values, 0, values.size() - 1);
|
||||||
size_t idxMed = values.size() / 2;
|
return values[i];
|
||||||
if (idxMed - (int)idxMed > 0) idxMed++;
|
|
||||||
return values[idxMed];
|
|
||||||
}
|
}
|
30
main.cpp
30
main.cpp
@ -4,23 +4,43 @@
|
|||||||
#include "fileHandler.h"
|
#include "fileHandler.h"
|
||||||
#include "Timing.h"
|
#include "Timing.h"
|
||||||
#include "MedianQuicksort.h"
|
#include "MedianQuicksort.h"
|
||||||
|
#include "MedianOfMedians.h"
|
||||||
|
#include "RandomizedSelect.h"
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
// read test values from input file
|
||||||
Timing::getInstance()->startRecord("init");
|
Timing::getInstance()->startRecord("init");
|
||||||
std::vector<size_t> numbers = readFromFile("testdata");
|
std::vector<size_t> numbers = readFromFile("testdata");
|
||||||
std::cout << "read " << numbers.size() << " values" << std::endl;
|
std::cout << "just read " << numbers.size() << " values" << std::endl;
|
||||||
Timing::getInstance()->stopRecord("init");
|
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
|
// vollständige Sortierung mit Quicksort und Ausgabe des mittleren Elements
|
||||||
Timing::getInstance()->startRecord("quicksort");
|
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");
|
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
|
// Verwendung des C++ STL function templates nth_element
|
||||||
Timing::getInstance()->startRecord("nth element");
|
Timing::getInstance()->startRecord("nth element");
|
||||||
std::nth_element(numbers.begin(), numbers.begin() + numbers.size() / 2, numbers.end());
|
std::nth_element(numbers.begin(), numbers.begin() + idxMed, numbers.end());
|
||||||
size_t idxMed = numbers.size() / 2;
|
|
||||||
if (idxMed - (int)idxMed > 0) idxMed++;
|
|
||||||
std::cout << "nth element: " << numbers[idxMed] << std::endl;
|
std::cout << "nth element: " << numbers[idxMed] << std::endl;
|
||||||
Timing::getInstance()->stopRecord("nth element");
|
Timing::getInstance()->stopRecord("nth element");
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user