如何交换数组中的最小和最大位置?

时间:2018-10-17 20:34:59

标签: c++ arrays for-loop if-statement swap

在代码中,我找到了任何给定数组的minmax值。现在,我想交换他们的职位,并打印出来。就像MinMax的位置一样,反之亦然。我该如何改变他们的位置?我猜我做错了。

#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 :(得分:4)

您已经具有找到最大值和最小值的索引。您还具有最大值和最小值。交换数组中的最大值和最小值对于该信息而言是微不足道的。使用:

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

改善代码的建议:

1。解决访问数组的问题

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

是一个问题,因为您正在使用越界索引来修改array。将其更改为使用k < arrSize

2。修复maxmin

的初始化

仅在用用户输入填充数组之后,才需要初始化maxmin。移线

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。删除代码以交换最大和最小

线条

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

交换maxmin的值,但它们不会更改数组的内容。

5。使用循环来打印数组

代替

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

使用

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

答案 1 :(得分:1)

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的有效数组索引范围是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;

将交换变量minmax的值。另外,如果可以用这种方法交换数组中的最小值和最大值,为什么还要记住它们的位置?试试

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');

因为(应该)已经在for循环内的输入循环中声明了前一个k,并且您习惯养成在尽可能靠近变量的位置声明和定义变量的习惯。另外,由于您希望在一行中创建一个列表,因此不要在循环内使用std::endl,而是在以后打印'\n'

答案 2 :(得分:1)

好吧,您有以下代码:

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

是的,这是将它们首先指向第一个元素的常用技术,但是您需要使用实际值,而不是用于初始化数据的值。在数据集中(均为正数),结果将始终为min == 0indexOfMin始终指向0。

问题是您实际上不需要保留minmax的值,因为索引已足够:

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。