Поиск максимального и минимального элементов двумерного динамического массива

Как поменять местами максимальный и минимальный элемент?

#include <iostream>
#include <locale>


using namespace std;

int main()
{
    setlocale(LC_ALL, "Russian");
    int N;
    cout << "Введите размер квадратной матрицы N:";
    cin >> N;
    float **arr = new float *[N]; 
    for (int i = 0; i < N; i++)
    {
        arr[i] = new float[N];
    }

    for(int i=0; i<N;i++)
    {
        for (int j = 0; j < N; j++) 
        {
            arr[i][j]=rand() % 100;
            cout << arr[i][j]<<"\t";
        }   
        cout << endl;
    }
    int max = arr[0][0];
    int min = max;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (max < arr[i][j])
                max = arr[i][j];
        }
    }
    cout <<"MAX="<< max<<endl;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (min > arr[i][j])
                min = arr[i][j];
        }
    }
    cout << "MIN=" <<min;
    cout << endl;
    
    for(int i=0; i<N; i++)
    {
        delete[] arr[i];
    }
    delete[] arr;
    return 0;
}

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

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

Максимальный и минимальный элемент вы уже нашли, теперь в тех местах где вы их сохраняете, сохраните также индексы и передайте в эту функцию:

 void swap(const int maxI, const int maxJ, const minI const minJ, float** matrix)
 {
       const float tmp = matrix[maxI][maxJ];
       matrix[maxI][maxJ] = matrix[minI][minJ];
       matrix[minI][minJ] = tmp;
 }
→ Ссылка
Автор решения: Никита Самоуков

Использовать std::swap.

Искать через std::min_element.

Таблицу уложить в один std::vector, а не двумерный массив.

→ Ссылка
Автор решения: sibedir
#include <iostream>
#include <locale>


using namespace std;

int main()
{
    setlocale(LC_ALL, "Russian");

    //ввод размера
    int N;
    cout << "Введите размер квадратной матрицы N: ";
    cin >> N;
    cout << endl;

    // выделяем память одним куском
    int *arr = new int[N*N];

    // заполняем и выводим
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            arr[i*N+j] = rand() % 100;
            cout << arr[i*N+j] << "\t";
        }
        cout << endl;
    }
    cout << endl;

    // ищем адреса с MAX и MIN
    int* max = arr; // можно &arr[0] для наглядности
    int* min = max;
    for (int* cur = arr, *end = &arr[N*N]; cur < end; cur++) {
        if (*max < *cur) max = cur;
        if (*min > *cur) min = cur;
    }
    // выводим их значения
    cout << "MAX = " << *max << endl;
    cout << "MIN = " << *min << endl;
    cout << endl;

    // меняем местами
    std::swap(*min, *max);

    //выводим
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            cout << arr[i * N + j] << "\t";
        cout << endl;
    }
    cout << endl;

    // освобождаем память
    delete[] arr;

    return 0;
}
  1. !!! Будте внимательнее с типами. В Вашем исходном коде тип максимума и минимума не соответствует типу значений элементов массива.
  2. Выделять память под массив можно и как в вашем коде (построчно) и обращаться к элементам массива через [i][j]. Так, наверное, даже будет выглядеть аутентичнее для новичка. Но тем не менее понимание адресной арифметики - это фундаментальные знания в программировании. Очень советую.
→ Ссылка