Как поменять местами мин и макс в массиве? - PullRequest
0 голосов
/ 17 октября 2018

Здесь в коде я нашел значения min и max любого данного массива.Теперь я хочу поменять их местами и распечатать.Как Min в положении Max и наоборот.Как я могу изменить свои позиции?Я сделал это неправильно, я думаю.

#include <iostream>

using namespace std;

int main()
{
    int array[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; 
    int min = array[0]; 
    int max = array[0]; 
    int indexOfMin = 0; 
    int indexOfMax = 0; 
    int arrSize = sizeof(array)/sizeof(array[0]); 
    int temp = 0; 

    cout << "Enter an array: "; 

    int k;
    for(k = 0; k <= arrSize; k++){ 
        cin >> array[k];
    }

    for (int i = 0; i < arrSize; i++){ 
         if(array[i] >= max ){          
            max = array[i];            
            indexOfMax = i;            
        }
    }

    for (int i = 0; i < arrSize; i++){ 
        if(array[i] == min){           
            continue;
        }
        if(array[i] < min){
            min = array[i];
            indexOfMin = i;
        }
    }

    temp = min;
    min = max;
    max = temp;

    cout << array[k] << " " <<endl;

    return 0;
}

Вход = 1, 5, 9, 1, 2, 9, 1, 3
Выход = 9, 5, 9, 1, 2, 1, 1, 3

Ответы [ 3 ]

0 голосов
/ 17 октября 2018
int min = array[0];
int max = array[0];

Вы еще этого не знаете.array[0] в этой точке программы равно 0 ... но 0 может не быть элементом массива после ввода пользователя.

int indexOfMin = 0;
int indexOfMax = 0;

Индексирует иразмеры объектов в памяти должны быть типа std::size_t (<cstddef>), поскольку гарантируется, что std::size_t достаточно велик.Нет такой гарантии для int.

int arrSize = sizeof(array) / sizeof(array[0]);

Используйте std::size() (<iterator>) для более ясного кода:

auto const arrSize{ std::size(array) };
int k;
for (k = 0; k <= arrSize; k++) {
    cin >> array[k]; 
}

Допустимые индексы массива варьируются от 0 до <<code>N для массива array[N].Вы получаете доступ к массиву за пределами.Используйте k < arrSize в качестве условия.k должен иметь тип std::size_t.

for (int i = 0; i < arrSize; i++) {
  if (array[i] >= max) {
      max = array[i];
      indexOfMax = i;
  }
}

for (int i = 0; i < arrSize; i++) {
  if (array[i] == min) {
      continue;
  }
  if (array[i] < min) {
      min = array[i];
      indexOfMin = i;
  }
}

Если вы определили int min = array[0]; и int max = array[0]; после ввода пользователя, вы можете запустить эти циклы с i = 1.if (array[i] == min) { continue; } ничего не покупает.Наоборот, это лишняя трата времени на дополнительное сравнение.Также оба цикла можно объединить в один:

int min{ array[0] };
int max{ array[0] };

std::size_t indexOfMin{ 0 };
std::size_t indexOfMax{ 0 };

for (size_t i{ 1 }; i < arrSize; ++i) {
    if(array[i] < min) {
        min = array[i];
        indexOfMin = i;
    }
    else if(array[i] > max) {
        max = array[i];
        indexOfMax = i;
    }
}
temp = min;
min = max;
max = temp;

Поменяет местами значения переменных min и max.Кроме того, если поменять местами минимальные и максимальные значения в массиве можно так, зачем запоминать их положение?Попробуйте

temp = array[indexOfMin];
array[indexOfMax] = array[indexOfMin];
array[indexOfMin = temp];

Итак, в конце я просто пишу

for (k = 0; k <= 7; k++) {
    cout << array[k] << " " << endl;
}

?

Нет, вы пишете

for (std::size_t k = 0; k < arrSize; k++) {
    std::cout << array[k] << " ";
}
std::cout.put('\n');

, потому что вы (должны) объявили предыдущий k из цикла ввода внутри цикла for, и вы делаете привычкой объявлять и определять переменные как можно ближе к месту их использования.Кроме того, поскольку вам нужен список в одну строку, не используйте std::endl внутри цикла, а выведите '\n' впоследствии.

0 голосов
/ 17 октября 2018

Ну, у вас есть этот код:

int min = array[0]; 
int max = array[0]; 

да, это обычная техника, чтобы сначала указать их первому элементу, но вам нужно использовать фактические значения, а не значения, которые вы использовали для инициализации данных.В вашем наборе данных (все положительные) у вас всегда будет min == 0, а indexOfMin всегда будет указывать на 0.

Дело в том, что вам на самом деле не нужно сохранять значение для min иmax как индексы достаточно:

for (int i = 1; i < arrSize; i++) {
    if (array[indexOfMax] < array[i]) 
       indexOfMax = i;
    if (array[indexOfMin] > array[i]) 
       indexOfMin = i;

}

и теперь вы можете поменять их местами:

std::swap( array[indexOfMax], array[indexOfMin] );

или использовать temp, если yo не разрешено использоватьстандартная библиотека.

0 голосов
/ 17 октября 2018

У вас уже есть индексы, где находятся максимум и минимум.У вас также есть максимум и мин.Поменять местами значения max и min в массиве тривиально с этой информацией.Используйте:

array[indexofMin] = max;
array[indexOfMax] = min;

Предложений для улучшения вашего кода:

1.Исправить проблему доступа к массиву

for(k = 0; k <= arrSize; k++){ 
    cin >> array[k];
}

- это проблема, так как вы изменяете array, используя индекс вне границ.Измените его на k < arrSize.

2.Исправьте инициализацию max и min

Вам нужно инициализировать max и min только после того, как массив будет заполнен пользовательским вводом.Переместите строки

int min = array[0]; 
int max = array[0]; 

вправо после цикла, чтобы прочитать данные.

3.Используйте только один цикл для вычисления максимума и минимума

for (int i = 0; i < arrSize; i++){ 
     if(array[i] >= max ){          
        max = array[i];            
        indexOfMax = i;            
    }

    if(array[i] < min){
        min = array[i];
        indexOfMin = i;
    }
}

4.Удалите код, чтобы поменять местами max и min

Строки

temp = min;
min = max;
max = temp;

меняют значения max и min, но они не изменяют содержимое массива.

5.Используйте цикл для печати массива

Вместо

cout << array[k] << " " <<endl;

используйте

for (int i = 0; i < arrSize; i++){ 
   cout << array[k] << " ";
}
cout << endl;
...