Make mergesort working
This commit is contained in:
parent
b744c5489d
commit
07bb269175
@ -3,8 +3,7 @@ FROM ubuntu:${UBUNTU_VERSION}
|
|||||||
|
|
||||||
# Build environment
|
# Build environment
|
||||||
# Profiling and analyzer tools
|
# Profiling and analyzer tools
|
||||||
RUN --mount=type=bind,target=/var/lib/apt \
|
RUN apt-get -y update \
|
||||||
apt-get -y update \
|
|
||||||
&& DEBIAN_FRONTEND=noninteractive TZ=Europe/Berlin apt-get -y install tzdata apt-utils \
|
&& DEBIAN_FRONTEND=noninteractive TZ=Europe/Berlin apt-get -y install tzdata apt-utils \
|
||||||
&& apt-get -y upgrade \
|
&& apt-get -y upgrade \
|
||||||
&& apt-get -y install python3 python3-pip lsb-release software-properties-common \
|
&& apt-get -y install python3 python3-pip lsb-release software-properties-common \
|
||||||
|
@ -8,7 +8,7 @@ print("Generated random vector with {} entries".format(randvec.size))
|
|||||||
|
|
||||||
with open("dataset.dat", "w") as file:
|
with open("dataset.dat", "w") as file:
|
||||||
for value in randvec:
|
for value in randvec:
|
||||||
file.write("{}\n".format(value))
|
file.write(str(value) + '\n')
|
||||||
|
|
||||||
fsize = os.path.getsize("dataset.dat")
|
fsize = os.path.getsize("dataset.dat")
|
||||||
print("File written down with Size {} MB".format(fsize/1000/1000))
|
print("File written down with Size {} MB".format(fsize/1000/1000))
|
@ -1,7 +1,6 @@
|
|||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <QFile>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
#include <mergesort.h>
|
#include <mergesort.h>
|
||||||
|
|
||||||
@ -22,40 +21,48 @@ your predictions and their graphical illustration?
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
QFile file("dataset.dat");
|
try {
|
||||||
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
std::ifstream file("dataset.dat", std::ios_base::in);
|
||||||
|
|
||||||
|
fmt::print("Opened file {} sucessfully!\n", "dummy");
|
||||||
|
|
||||||
|
std::vector<int32_t> dataset{10, 3, 244, 23, 293, 2393, 302};
|
||||||
|
|
||||||
|
// std::vector<int32_t> dataset;
|
||||||
|
// int counter = 0;
|
||||||
|
//
|
||||||
|
// while(!file.eof()) {
|
||||||
|
// int32_t buf;
|
||||||
|
// file >> buf;
|
||||||
|
// dataset.emplace_back(buf);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// fmt::print("Read {} values from {}\n", dataset.size(), "dummy");
|
||||||
|
|
||||||
|
algo::mergesort(dataset.begin(), dataset.end(), [](int32_t a, int32_t b) {
|
||||||
|
return (a>b);
|
||||||
|
});
|
||||||
|
|
||||||
|
fmt::print("sorted");
|
||||||
|
|
||||||
|
// QFile outfile("dataset-sorted.dat");
|
||||||
|
// if(!outfile.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||||
|
// fmt::print("Error! Could not create output file");
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// for(auto &val : dataset) {
|
||||||
|
// outfile.write(fmt::format("{}\n", val).c_str());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// file.close();
|
||||||
|
// outfile.flush();
|
||||||
|
// outfile.close();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
} catch (std::exception e) {
|
||||||
fmt::print("Could not open file");
|
fmt::print("Could not open file");
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt::print("Opened file {} sucessfully!\n", file.fileName().toStdString());
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<int32_t> dataset;
|
|
||||||
int counter = 0;
|
|
||||||
|
|
||||||
while(!file.atEnd()) {
|
|
||||||
dataset.emplace_back(file.readLine().toInt());
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt::print("Read {} values from {}\n", dataset.size(), file.fileName().toStdString());
|
|
||||||
|
|
||||||
algo::mergesort(dataset.begin(), dataset.end(), [](int32_t a, int32_t b) {
|
|
||||||
return (a>b);
|
|
||||||
});
|
|
||||||
|
|
||||||
QFile outfile("dataset-sorted.dat");
|
|
||||||
if(!outfile.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
|
||||||
fmt::print("Error! Could not create output file");
|
|
||||||
}
|
|
||||||
|
|
||||||
for(auto &val : dataset) {
|
|
||||||
outfile.write(fmt::format("{}\n", val).c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
outfile.flush();
|
|
||||||
outfile.close();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ namespace algo {
|
|||||||
template<typename Iterator, typename Comparator>
|
template<typename Iterator, typename Comparator>
|
||||||
void merge(Iterator start, Iterator middle, Iterator end, Comparator cmp, Iterator output_start) {
|
void merge(Iterator start, Iterator middle, Iterator end, Comparator cmp, Iterator output_start) {
|
||||||
Iterator start_m = start;
|
Iterator start_m = start;
|
||||||
|
Iterator begin = output_start;
|
||||||
Iterator start2 = middle + 1;
|
Iterator start2 = middle + 1;
|
||||||
|
|
||||||
//merge from input until one half completes
|
//merge from input until one half completes
|
||||||
@ -35,37 +36,40 @@ namespace algo {
|
|||||||
output_start++;
|
output_start++;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto nit = std::distance(start_m, end);
|
const auto size = std::distance(start_m, end);
|
||||||
for (auto i = 0; i <= nit; i++, start_m++, output_start++) {
|
for (auto i = 0; i <= size; i++, start_m++, begin++) {
|
||||||
*start_m = *output_start;
|
*start_m = *begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Container, typename Iterator, typename Comparator>
|
template<typename Container, typename Iterator, typename Comparator>
|
||||||
void mergesort_splitup(Container &output_vec, Iterator start, Iterator end, Comparator cmp, Iterator output_start) {
|
void ms_split(Container &output_vec, Iterator start, Iterator end, Comparator cmp, Iterator output_start) {
|
||||||
Iterator middle = start;
|
Iterator mid = start;
|
||||||
Iterator output_started_from = output_start;
|
Iterator begin = output_start;
|
||||||
|
|
||||||
//move middle iterator litterally to the middle
|
if (std::distance(start, end) < 1) {
|
||||||
std::advance(middle, std::distance(start, end) / 2);
|
return;
|
||||||
//sort the first half within an recursion
|
} else {
|
||||||
mergesort_splitup(output_vec, start, middle, cmp, output_start);
|
//move mid iterator litterally to the mid
|
||||||
|
std::advance(mid, std::distance(start, end) / 2);
|
||||||
|
//sort the first half within an recursion
|
||||||
|
ms_split(output_vec, start, mid, cmp, output_start);
|
||||||
|
|
||||||
//move output iterator
|
//move output iterator
|
||||||
std::advance(output_start, std::distance(start, middle + 1));
|
std::advance(output_start, std::distance(start, mid + 1));
|
||||||
//sort the second half within a recursion
|
//sort the second half within a recursion
|
||||||
mergesort_splitup(output_vec, middle + 1, end, cmp, output_start);
|
ms_split(output_vec, mid + 1, end, cmp, output_start);
|
||||||
|
|
||||||
//merge everything together starting from the complete beginning
|
//merge everything together starting from the complete beginning
|
||||||
merge(start, middle, end, cmp, output_started_from);
|
merge(start, mid, end, cmp, begin);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Iterator, typename Comparator>
|
template<typename Iterator, typename Comparator>
|
||||||
void mergesort(Iterator start, Iterator end, Comparator cmp) {
|
void mergesort(Iterator start, Iterator end, Comparator cmp) {
|
||||||
using valtype = typename std::iterator_traits<Iterator>::value_type;
|
using valtype = typename std::iterator_traits<Iterator>::value_type;
|
||||||
|
std::vector<valtype> temporary_dataset(std::distance(start, end));
|
||||||
std::vector<valtype> output_vec(std::distance(start, end));
|
ms_split(temporary_dataset, start, end - 1, cmp, temporary_dataset.begin());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user