Не могу решить задачу с массивом c++
Сама задача: В преобразованном линейном массиве найти макс и мин по значению элементы, считая что такие элементы единственные. Элементы, расположенные между макс и мин, переместить в начало массива с одновременным удалением с исходных мест. Найденные значения и преобразованный линейный массив выдать на экран в строку. Не получается диапазон между максимальным и минимальным числом переместить в начало, перемещается вместе с мин и максимальным числом или если диапазон близко к концу массива выдаёт не те значения Вот мой код:
#include <iostream>
#include <time.h>
using namespace std;
int main() {
setlocale(LC_ALL, "");
int n;
cout << "Введите колличество чисел: ";
cin >> n;
int* a = new int[n + 1];
srand((int)time(NULL));
for (int i = 0; i < n; a[i++] = rand() % 200 - 100);
a[rand() % n] = 0; //Для наглядности
for (int i = 0; i < n; cout << a[i++] << ' ');
for (int i = 0; i < n;)
if (a[i] == 0 || a[i] < -200) {
for (; i < n; i++)
a[i]> -200 && a[i] != 404 ? a[i] = a[i+1]: a[i] = 404;
i = 0;
}
else i++;
cout << '\n';
int min = 1000;
int min_count = 0;
for (int i = 0; i < n; a[i] < min ? min = a[i], min_count = i++ : i++);
cout << "min: " <<min << '\n';
int max = -1000;
int max_count = 0;
for (int i = 0; i < n; a[i] > max && a[i] != 404 ? max = a[i], max_count = i++ : i++);
cout << "max: " << max << '\n';
int temp;
if (max_count > min_count && max_count != min_count + 1) {
//max_count--, min_count++;
for (int i = 0; i < max_count; i++) {
if (i < max_count - 1) {
temp = a[i];
a[i] = a[i - 1];
a[i -1] = temp;
}
else a[i++] = 404;
}
}
else if (max_count < min_count && max_count + 1 != min_count)
//max_count++, min_count--;
for (int i = 0; i < min_count; i++) {
if (i < min_count - 1) {
temp = a[i];
a[i] = a[i - 1];
a[i - 1] = temp;
}
else a[i++] = 404;
}
for (int i = 0; i < n; i++)
if(a[i] != 404)
cout << a[i] << ' ';
cout << '\n';
system("pause");
}
Ответы (1 шт):
Итак, вы нашли индексы минимума и максимума ia и ib. Если ia>ib, то поменять их местами.
Теперь копируем элементы от ia+1 до ib-1 во вспомогательный массив
Передвигаем элементы от ia до 0 (цикл по убыванию!) на ib-ia-1 мест вправо.
Копируем содержимое вспомогательного массива.
int main() {
setlocale(LC_ALL, "");
int n;
cout << "Введите количество чисел: ";
cin >> n;
int* a = new int[n + 1];
srand((unsigned)time(NULL));
for (int i = 0; i < n; a[i++] = rand() % 200 - 100);
for (int i = 0; i < n; cout << a[i++] << ' ');
cout << '\n';
int ia = 0, ib = 0;
for (int i = 1; i < n; i++)
if (a[i] < a[ia])
ia = i;
else
if (a[i] > a[ib])
ib = i;
if (ia > ib) {
int t = ia;
ia = ib;
ib = t;
}
int l = ib - ia - 1;
int* t = new int[l];
for (int i = 0; i < l; i++)
t[i] = a[i + ia + 1];
for (int i = ia; i >= 0; i--)
a[i + l] = a[i];
for (int i = 0; i < l; i++)
a[i] = t[i];
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
cout << '\n';
return 0;
}