Files
SortLab/src/sorters/SelectionSorter.cpp
T
2026-03-03 16:39:41 +03:00

95 lines
2.3 KiB
C++

#include "sorters/SelectionSorter.hpp"
SelectionSorter::SelectionSorter()
: i_(0), j_(0), minIndex_(0), n_(0), finished_(false), phase_(Phase::FINDING_MIN) {
}
void SelectionSorter::step(Array& array) {
if (finished_) {
return;
}
if (n_ == 0) {
n_ = array.getSize();
minIndex_ = 0;
}
if (phase_ == Phase::FINDING_MIN) {
if (j_ == i_) {
minIndex_ = i_;
j_++;
}
if (j_ < n_) {
array.resetStates();
array.setState(i_, Array::State::COMPARE);
array.setState(j_, Array::State::COMPARE);
array.setState(minIndex_, Array::State::SWAP);
array.incrementComparisons();
if (array.getValue(j_) < array.getValue(minIndex_)) {
minIndex_ = j_;
}
j_++;
} else {
phase_ = Phase::SWAPPING;
}
} else if (phase_ == Phase::SWAPPING) {
if (minIndex_ != i_) {
array.resetStates();
array.setState(i_, Array::State::SWAP);
array.setState(minIndex_, Array::State::SWAP);
float temp = array.getValue(i_);
array.setValue(i_, array.getValue(minIndex_));
array.setValue(minIndex_, temp);
array.incrementSwaps();
}
array.setState(i_, Array::State::SORTED);
phase_ = Phase::NEXT;
} else if (phase_ == Phase::NEXT) {
i_++;
if (i_ >= n_ - 1) {
array.resetStates();
for (int k = 0; k < n_; ++k) {
array.setState(k, Array::State::SORTED);
}
finished_ = true;
return;
}
j_ = i_;
phase_ = Phase::FINDING_MIN;
}
}
bool SelectionSorter::isFinished() const {
return finished_;
}
std::string SelectionSorter::getName() const {
return "Selection Sort";
}
std::string SelectionSorter::getTimeComplexity() const {
return "O(n²) / O(n²) / O(n²)";
}
std::string SelectionSorter::getSpaceComplexity() const {
return "O(1)";
}
void SelectionSorter::reset() {
i_ = 0;
j_ = 0;
minIndex_ = 0;
n_ = 0;
finished_ = false;
phase_ = Phase::FINDING_MIN;
}