Не могу решить задачу с массивом 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 шт):

Автор решения: MBo

Итак, вы нашли индексы минимума и максимума 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;
}
→ Ссылка