Сортировка массива методом вставки C++
У меня есть такой код. Он сортирует элементы по сумме цифр по возрастанию методом вставки. Как сортировать только нечётные элементы, а чётные оставить на своих местах.
int sumOfDigits(int num) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
void insertionSortBySumOfDigits(int arr[], int n) {
for (int i = 1; i < n; ++i) {
int key = arr[i];
int keySum = sumOfDigits(key);
int j = i - 1;
while (j >= 0 && sumOfDigits(arr[j]) > keySum) {
arr[j + 1] = arr[j];
--j;
}
arr[j + 1] = key;
}
}
int main() {
const int size = 10;
int arr[size];
setlocale(LC_ALL, "Russian");
std::cout << "Введите " << size << " целых чисел для массива:\n";
for (int i = 0; i < size; ++i) {
std::cout << "Элемент " << i + 1 << ": ";
while (!(std::cin >> arr[i])) {
std::cout << "Пожалуйста, введите число: ";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
std::cout << "Исходный массив: ";
for (int i = 0; i < size; ++i) {
std::cout << arr[i] << " ";
}
insertionSortBySumOfDigits(arr, size);
std::cout << "\nОтсортированный массив: ";
for (int i = 0; i < size; ++i) {
std::cout << arr[i] << " ";
}
return 0;
}
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Попробуйте (тест C-варианта):
void insertionSortBySumOfDigits(int arr[], int n) {
int t, key, j, i = 0;
while (i < n && (arr[i]&1)==0)
i++;
if (i==n)
return;
i++;
while (i < n) {
while (i < n && (arr[i]&1)==0)
i++;
if (i==n)
break;
key = arr[i];
t = i;
j = i - 1;
while (j >=0) {
while (j>=0 && (arr[j]&1)==0)
j--;
if (j < 0 || arr[j]<= key)
break;
arr[t] = arr[j];
t = j;
j--;
}
arr[t] = key;
i++;
}
}