Меня попросили создать программу, которая считывает 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;
}