如何交换数组中Min和Max的位置?

问题描述 投票:0回答:4

在代码中,我找到了任何给定数组的

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

c++ arrays for-loop if-statement swap
4个回答
4
投票

您已经有了找到最大值和最小值的索引。您还拥有最大值和最小值。利用该信息交换数组中的最大值和最小值是很简单的。用途:

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;

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;

将交换变量

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

因为您(应该)已经在 for 循环内的输入循环中声明了前面的

k
,并且您养成了在尽可能靠近使用变量的位置声明和定义变量的好习惯。另外,由于您想要在一行中列出一个列表,因此不要在循环内使用
std::endl
,而是在之后打印
'\n'


1
投票

好吧,你有这个代码:

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。


0
投票
This could be the best and optimal solution:-

#include <iostream>
using namespace std;

int swapMinMx(int n,int arr[]){
     int minIndex = 0;
     int maxIndex = 0;
     int temp = 0;

     for(int i=0;i<n;i++){          //To find max element
         if(arr[i] > arr[maxIndex]){
             maxIndex = i;
         }
      }
      for(int i=0;i<n;i++){      //To find min element
           if(arr[i] < arr[minIndex]){
                arr[minIndex] = arr[i];
           }
       }

    //Swapping max and min elements:
       temp = arr[minIndex];
       arr[minIndex] = arr[maxIndex];
       arr[maxIndex] = temp;

    //To print the array elements after swapping 
       for(int i=0; i<n ; i++){
          cout << arr[i] << " ";
        }
     return 0;
   }

int main(){
    int arr[30];
    int n;
    cout << "Enter the size of the array: " << endl;
    cin >> n;
    cout << "enter the array elements: " << endl;
    for(int i=0 ; i<n ; i++){
       cin >> arr[i];
    }
    swapMaxMin(n,arr);
    return 0;
  }
© www.soinside.com 2019 - 2024. All rights reserved.