Implement simple mergesort
This commit is contained in:
parent
a1c81529b9
commit
b744c5489d
@ -27,5 +27,4 @@ RUN env; if [[ ${UBUNTU_VERSION} == "23.04" || ${UBUNTU_VERSION} == "23.10" ]];
|
|||||||
pip3 install conan==${CONAN_VERSION}; fi
|
pip3 install conan==${CONAN_VERSION}; fi
|
||||||
|
|
||||||
ARG GCC_VERSION="13"
|
ARG GCC_VERSION="13"
|
||||||
RUN apt-get -y install gcc-${GCC_VERSION} g++-${GCC_VERSION}
|
RUN apt-get -y install gcc-${GCC_VERSION} g++-${GCC_VERSION}
|
||||||
|
|
@ -18,7 +18,9 @@ add_custom_target(task1_7_dataset
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/dataset.dat
|
${CMAKE_CURRENT_SOURCE_DIR}/dataset.dat
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/dataset.dat)
|
${CMAKE_CURRENT_BINARY_DIR}/dataset.dat)
|
||||||
|
|
||||||
add_executable(task1_7 main.cpp)
|
add_executable(task1_7 main.cpp
|
||||||
|
mergesort.h)
|
||||||
|
|
||||||
target_link_libraries(task1_7
|
target_link_libraries(task1_7
|
||||||
fmt::fmt
|
fmt::fmt
|
||||||
Qt::Core)
|
Qt::Core)
|
||||||
|
@ -2,7 +2,8 @@
|
|||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <printf.h>
|
|
||||||
|
#include <mergesort.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Create a simple sorting application that uses the mergesort algorithm to sort a
|
Create a simple sorting application that uses the mergesort algorithm to sort a
|
||||||
@ -23,7 +24,7 @@ your predictions and their graphical illustration?
|
|||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
QFile file("dataset.dat");
|
QFile file("dataset.dat");
|
||||||
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
//qDebug() << "Could not open file";
|
fmt::print("Could not open file");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,5 +40,22 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
fmt::print("Read {} values from {}\n", dataset.size(), file.fileName().toStdString());
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
0
task1/mergesort.cpp
Normal file
0
task1/mergesort.cpp
Normal file
71
task1/mergesort.h
Normal file
71
task1/mergesort.h
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace algo {
|
||||||
|
|
||||||
|
template<typename Iterator, typename Comparator>
|
||||||
|
void merge(Iterator start, Iterator middle, Iterator end, Comparator cmp, Iterator output_start) {
|
||||||
|
Iterator start_m = start;
|
||||||
|
Iterator start2 = middle + 1;
|
||||||
|
|
||||||
|
//merge from input until one half completes
|
||||||
|
while (start <= middle && start2 <= end) {
|
||||||
|
if (cmp(*start, *start2)) {
|
||||||
|
*output_start = *start;
|
||||||
|
start++;
|
||||||
|
} else {
|
||||||
|
*output_start = *start2;
|
||||||
|
start2++;
|
||||||
|
}
|
||||||
|
output_start++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//try to finish first half
|
||||||
|
while (start <= middle) {
|
||||||
|
*output_start = *start;
|
||||||
|
start++;
|
||||||
|
output_start++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (start2 <= end) {
|
||||||
|
*output_start = *start2;
|
||||||
|
start2++;
|
||||||
|
output_start++;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto nit = std::distance(start_m, end);
|
||||||
|
for (auto i = 0; i <= nit; i++, start_m++, output_start++) {
|
||||||
|
*start_m = *output_start;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Container, typename Iterator, typename Comparator>
|
||||||
|
void mergesort_splitup(Container &output_vec, Iterator start, Iterator end, Comparator cmp, Iterator output_start) {
|
||||||
|
Iterator middle = start;
|
||||||
|
Iterator output_started_from = output_start;
|
||||||
|
|
||||||
|
//move middle iterator litterally to the middle
|
||||||
|
std::advance(middle, std::distance(start, end) / 2);
|
||||||
|
//sort the first half within an recursion
|
||||||
|
mergesort_splitup(output_vec, start, middle, cmp, output_start);
|
||||||
|
|
||||||
|
//move output iterator
|
||||||
|
std::advance(output_start, std::distance(start, middle + 1));
|
||||||
|
//sort the second half within a recursion
|
||||||
|
mergesort_splitup(output_vec, middle + 1, end, cmp, output_start);
|
||||||
|
|
||||||
|
//merge everything together starting from the complete beginning
|
||||||
|
merge(start, middle, end, cmp, output_started_from);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Iterator, typename Comparator>
|
||||||
|
void mergesort(Iterator start, Iterator end, Comparator cmp) {
|
||||||
|
using valtype = typename std::iterator_traits<Iterator>::value_type;
|
||||||
|
|
||||||
|
std::vector<valtype> output_vec(std::distance(start, end));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user