Минимальное количество перестановок, необходимое для сортировки вектора - PullRequest
0 голосов
/ 08 марта 2019

Меня попросили создать программу, которая считывает N чисел из файла (может включать в себя дубликаты) и печатает минимальное количество обменов, необходимых для сортировки в порядке возрастания. Перестановки могут выполняться между любыми номерами, они не обязательно должны быть соседними. Все темы, которые я здесь нашел, были посвящены массивам с различными элементами.

Пример: 2 1 3 2 2 (минимальное количество обменов равно 2)

Пока что я сделал модификацию сортировки выбора, которая, к сожалению, печатает правильный результат во всех моих тестовых примерах, кроме одного:

1 2 3 1 3 2 1 (результат должен быть 3 перестановки, но я получаю 4)

Это мой код:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

void find_min (unsigned short & mindex, vector <unsigned short> vec) {
    mindex = 0;
    for (unsigned int count = 0; count < vec.size(); count++) 
        if (vec[count] <= vec[mindex]) mindex = count;
}

int main() {
    ifstream file("sort.txt");
    unsigned short num, tmp, mindex;
    file >> num; //Get the number of elements
    vector <unsigned short> vec;
    for (int k = 0; k < num; k++) { //Read N elements
        file >> tmp;
        vec.push_back(tmp);
    }
    file.close();
    tmp = 0;
    while (num > 1) {
        find_min(mindex, vec);
        if (vec[0] != vec[mindex]) {
            swap(vec[0], vec[mindex]);
            tmp++;
        }
        vec.erase(vec.begin()); 
        num--;
    }
    cout<<tmp;
    return 0;
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...