如何交换数组中 Min 和 Max 的位置?
How to swap the positions of Min and Max in an array?
在代码中,我找到了任何给定数组的 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。修复 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。删除交换最大和最小值的代码
线条
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;
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
到 < 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];
So at the end i just write
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 == 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。
在代码中,我找到了任何给定数组的 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。修复 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。删除交换最大和最小值的代码
线条
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;
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
到 < 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];
So at the end i just write
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 == 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。