diff --git a/main.cpp b/main.cpp index a675859..0edf6e2 100644 --- a/main.cpp +++ b/main.cpp @@ -24,36 +24,28 @@ std::vector getReversalsToSort(const std::vector &arr) { std::vector sorted = arr; std::sort(sorted.begin(), sorted.end()); - std::vector intermediate = arr; - std::vector ret = {}; // a bit more explicit than necessary but my brain thought it was useful info std::vector::const_iterator search_reference = arr.cbegin(); - std::size_t i = arr.size() - 1; + std::size_t i = arr.size(); for (auto elem = sorted.rbegin(); elem != sorted.rend(); elem++) { // using search reference so we don't find the same element over and over // again search_reference = std::find(search_reference, arr.cend(), *elem); - std::size_t first_swap = search_reference - arr.cbegin(); + std::size_t first_swap = search_reference - arr.cbegin() + 1; std::size_t second_swap = i; // remove false positives of elements already being in the correct spot - if (first_swap != second_swap) { + // also remove cases where nothing changes in one of the reverses + // (that should never happen) + if (first_swap != second_swap && first_swap > 1 && second_swap > 1) { ret.push_back(first_swap); ret.push_back(second_swap); } i--; - // checking if we're done early - std::reverse(intermediate.begin(), intermediate.begin() + first_swap); - std::reverse(intermediate.begin(), intermediate.begin() + second_swap); - // TIL that std::equal exists - if (std::equal(arr.cbegin(), arr.cend(), intermediate.cbegin(), - intermediate.cend())) { - break; - } // pushing the search reference past what we just found so we don't find // it again if ((elem + 1) != sorted.rend() && *(elem + 1) == *elem) {