mirror of
https://github.com/koloideal/SortLab.git
synced 2026-06-10 10:25:30 +03:00
95 lines
2.3 KiB
C++
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;
|
|
}
|