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

How to swap the positions of Min and Max in an array?

本文关键字:位置 数组 交换      更新时间:2023-10-16

在代码中,我找到了任何给定数组的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

您已经拥有找到最大值和最小值的位置的索引。你也有最大值和最小值。交换数组中的最大值和最小值对于该信息来说微不足道。用:

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;
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]; 
}

数组array[N]的有效数组索引范围从0

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'

好吧,你有这个代码:

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。