在C++中实现选择排序时出错

Error implementing selection sort in C++

本文关键字:排序 出错 选择 实现 C++      更新时间:2023-10-16

我编写了这段代码来使用选择排序对数组进行排序,但它没有正确对数组进行排序。

#include <cstdlib>
#include <iostream>
using namespace std;
void selectionsort(int *b, int size)
{
   int i, k, menor, posmenor;
   for (i = 0; i < size - 1; i++)
   {
      posmenor = i;
      menor    = b[i];
      for (k = i + 1; k < size; k++)
      {
         if (b[k] < menor)
         {
            menor    = b[k];
            posmenor = k;
         }
      }
      b[posmenor] = b[i];
      b[i]        = menor;
   }
}

int main()
{
   typedef int   myarray[size];
   myarray b;
   for (int i = 1; i <= size; i++)
   {
      cout << "Ingrese numero " << i << ": ";
      cin >> b[i];
   }
   selectionsort(b, size);
   for (int l = 1; l <= size; l++)
   {
      cout << b[l] << endl;
   }
   system("Pause");
   return 0;
}

我找不到错误。我是C++新手。

感谢您的帮助。

selectionSort()函数很好。数组初始化和输出不是。见下文。

int main()
{
    int size = 10; // for example
    typedef int myarray[size];
    myarray b;
    for (int i=0;i<size;i++)
//------------^^--^
    {
        cout<<"Ingrese numero "<<i<<": ";
        cin>>b[i];
    }
    selectionsort(b,size);
    for (int i=0;i<size;i++)
//------------^^--^
    {
        cout<<b[l]<<endl;
    }
    system("Pause");
    return 0;
}

在 C 和 C++ 中,包含 n 元素的数组以0索引开头,以n-1索引结束。对于您的示例,起始索引为 0,结束索引为 9 。当你像在发布的代码中一样迭代时,你检查索引变量是否小于(或不等于)数组的大小,即 size .因此,在迭代的最后一,您访问 b[size] ,访问数组中最后一个元素旁边的内存位置,该位置不能保证包含任何有意义的内容(未初始化),因此输出中的随机数。

您在问题的评论中提供了一些示例输入。

我编译并执行了以下内容,我相信它准确地再现了您显示的代码和您的示例输入:

#include <iostream>
void selectionsort(int* b, int size)
{
    int i, k, menor, posmenor;
    for(i=0;i<size-1;i++)
    {
        posmenor=i;
        menor=b[i];
        for(k=i+1;k<size;k++)
        {
            if(b[k]<menor)
            {
                menor=b[k];
                posmenor=k;
            }
        }
        b[posmenor]=b[i];
        b[i]=menor;
    }
}
int main(int argc, char **argv)
{
    int a[10] = {-3, 100, 200, 2, 3, 4, -4, -5, 6, 0};
    selectionsort(a, 10);
    for (auto v:a)
    {
        std::cout << v << ' ';
    }
    std::cout << std::endl;
}

结果输出如下:

-5 -4 -3 0 2 3 4 6 100 200

这些结果看起来是正确的。我认为您的代码没有任何问题,并且通过使用您发布的示例输入,这证实了这一点。