返回数组中最小元素的索引

7

我正在尝试返回一个整数数组中最小元素的索引。我漏掉了什么吗?当我把我的整数放进去后,它没有返回索引。

更新:在int main()结束时,我遇到了关于数组堆栈被破坏的错误。谢谢。我的代码如下:

#include <iostream>
#include <conio.h>

using namespace std;

int indexofSmallestElement(double array[], int size);

int main()
{    
int size = 10; 
double array[10];

for (int i = 0; i <= size; i++)
{
    cout << "Enter an integer: " << endl;
    cin >> array[i];
}

indexofSmallestElement(array, size);
}

int indexofSmallestElement(double array[], int size)
{
int index = 0;

if (size != 1)
{

    int n = array[0];
    for (int i = 1; i < size; i++)
    {
        if (array[i] < n)
        {
            n = array[i];
            index = i;
        }
    }
}
return index;
}

4
应该是 n = array[0],而不是反过来。因为你想要把第一个数字作为假设的最小元素保存下来,然后从那里开始比较。 - Clark
除了@Clark说的之外,还要注意你丢弃了indexofSmallestElement的返回值并且没有显示它。还要注意你的循环使用了<= size这是不正确的——你应该使用< size。请记住,在C和C++中,数组从0开始,因此如果您的数组有10个项目,则有效索引为0、1、2、...、9。另外,你的index变量可能未初始化。想一想当最小元素是第一个元素时会发生什么。 - Nik Bougalis
这是您的堆栈损坏:for (int i = 0; i <= size; i++)。应该改为< - Matthew Lundberg
3个回答

17

有很多人向您展示了他们的indexofSmallestElement变体。我将包括我的版本,并解释为什么我认为它更好:

int indexofSmallestElement(double array[], int size)
{
    int index = 0;

    for(int i = 1; i < size; i++)
    {
        if(array[i] < array[index])
            index = i;              
    }

    return index;
}

你会注意到,我取消了变量n,这个变量是用来保存目前为止遇到最小值的。我这样做是因为,在我的经验中,必须保持两个不同的东西同步可能会导致微妙的错误。即使在这个简单的情况下,它也是多个错误的源头,其中一个是你声明了n为int类型,但是你给它赋的值是double类型。 底线:取消n变量,只跟踪一个东西:索引。
更新:当然,毫无疑问,使用C++17,这个问题的唯一合理答案是使用std::min_element函数:std::min_element
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdint>
#include <array>
#include <vector>

template <typename Iter>
auto indexofSmallestElement(Iter first, Iter last)
{
    return std::distance(first,
        std::min_element(first, last));
}

template <typename T, std::size_t N>
auto indexofSmallestElement(std::array<T, N> arr)
{
    return std::distance(std::begin(arr),
        std::min_element(std::begin(arr), std::end(arr)));
}

template <typename T>
auto indexofSmallestElement(std::vector<T> vec)
{
    return std::distance(std::begin(vec),
        std::min_element(std::begin(vec), std::end(vec)));
}


int main(int, char **)
{
    int arr[10] = { 7, 3, 4, 2, 0, 1, 9, 5, 6, 8 };

    auto x = indexofSmallestElement(std::begin(arr), std::end(arr));

    std::cout
        << "The smallest element in 'arr' is at index "
        << x << ": " << arr[x] << "\n";

    std::array<float, 5> fa { 0.0, 2.1, -1.7, 3.3, -4.2 };

    auto y = indexofSmallestElement(fa);

    std::cout
        << "The smallest element in 'fa' is at index "
        << y << ": " << fa[y] << "\n";

    return 0;
}

但是检查1是多余的——如果size=1,循环条件将在第一次失败。 - je4d
当然,你是正确的。我认为那是从代码复制粘贴中遗留下来的问题。已经修复了。 - Nik Bougalis
我在原帖中增加了一个新的错误。我尝试了你的方法,但并没有解决问题。是只有我这个问题吗? - gosutag
1
正如我在您原帖的评论中所解释的那样,您的“新”错误是由main函数中的这个循环引起的:for (int i = 0; i <= size; i++)。请记住,在C和C++中,数组从0开始,因此如果您的数组有10个项,有效索引将为0、1、2...9。然而,该循环将从0到10进行。换句话说,您正在试图将11个项目塞入10个项目的数组中。您的循环应该是:for (int i = 0; i < size; i++) - Nik Bougalis

3

应该是n = array [0]而不是array [0] = n。这意味着你假设数组的第一个元素最小,然后将其与其他元素进行比较。

此外,在循环中,您超出了数组的范围。for循环应该运行到i < size而不是i <= size

您的代码应该像这样...

int indexofSmallestElement(double array[], int size)
{
  int index = 0 ;
  double n = array[0] ;
  for (int i = 1; i < size; ++i)
  {
    if (array[i] < n)
    {
        n = array[i] ;
        index = i ;
    }
  }
 return index;
}

0
在循环内使用array[i]和index = i。Size是边界 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接