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

时间:2016-02-11 02:58:04

标签: c++ arrays algorithm sorting

我已编写此代码以使用选择排序对数组进行排序,但它不会正确对数组进行排序。

#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 ++的新手。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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],访问数组中最后一个元素旁边的内存中的位置,这不能保证包含任何有意义的内容(未初始化) ),因此输出中的随机数。

答案 1 :(得分:0)

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

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

#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

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