Здравствуйте,тут ошибка или я что то не понимаю

Задание 3. В целочисленном массиве упорядочить по убыванию элементы, стоящие между первым максимальным и последним минимальным элементами

#include <conio.h>
#include <iostream>
using namespace std;
    int main() {
    int arr[100] = {};
    int n = -1;
    while (n < 0)
        cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
    int max = arr[0], min = arr[0], sizemax = 0, sizemin = 0;
    for (int i = 1; i < n; i++)
    {
        if (max < arr[i])
        {
            sizemax = i;
            max = arr[i];
        }
        if (min >= arr[i])
        {
            sizemin = i;
            min = arr[i];
        }
    }
    for (int i = sizemax + 1; i < sizemin; i++)
    {
        for (int j = sizemin - 1; j > i; --j)
        {
            if (arr[j] > arr[j - 1])
            {
                int t = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = t;
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << "  ";
    }
    _getch();
    return 0;
}

Например делаю такие тесты 1 тест

Ввожу

2
34
4
5
666
54
656
55
1
6

Программа выводит - 2 34 4 5 666 656 55 54 1 6

Всё правильно, НО

Например, 2 тест

Ввожу

1
434
435
436
437
438
439
440
444
4444

Программа выводит тоже самое - 1 434 435 436 437 438 439 440 444 4444

На 2 тесте программа должна переставить 4444 и 1,а также упорядочить цифры между ними по убыванию. Или я неправильно понимаю задачу?


Ответы (1 шт):

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

Я понимаю задание так: найти первый максимальный элемент, последний минимальный. Есть 2 точки, неважно - слева минимальный, а справа максимальный или нет. Надо отсортировать всё между этими точками, не включая их.

Я бы делал так:

int main()
{
    int arr[100] = {};
    int n = -1;

    while (n < 0) cin >> n;
    int m = 0, M = 0, im = 0, iM = 0;

    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
        if (i == 0)
        {
            m = M = arr[i];
        }
        else
        {
            if (M <  arr[i]) { M = arr[i]; iM = i; }
            if (m >= arr[i]) { m = arr[i]; im = i; }
        }
    }
    if (im > iM) swap(im,iM);

    sort(arr+im+1,arr+iM,greater<int>());

    for(int i = 0; i < n; i++)
    {
        cout << arr[i] << "  ";
    }
}

Вернее, я бы делал с вектором, на раз уж вы хотите массив...

В результате пример 2 дает

1  444  440  439  438  437  436  435  434  4444  

Последний минимальный - это первый элемент массива, первый максимальный - последний элемент массива. Все, что между ними (не включая их) сортируем по убыванию...

И еще - не путайте цифры и числа, неудобно ведь...

→ Ссылка