如何使此选择搜索起作用?

时间:2019-05-07 05:44:52

标签: c++

我正在尝试按降序对数组中的十个值进行排序,但似乎无法正确处理。

我已经尝试过两次将代码复制到我的书中,甚至从youtube复制了代码,但仍然无法正常工作。有人请帮助我!我已经尝试了一切,这吓到我了。

void selectionSort(int list[], int size)
{
  //Display variables
  int minIndex, minValue, num;

  //Calculate the array in descending order
  for(int index = 0; index < size; index++)
  {

    minValue = list[index];
    minIndex = index;

    for(int index2; index2 < size; index2++)
    {
        if(list[index2] < minValue)
        {
            minValue = list[index2];
            minIndex = index2;
        }
    }
    swap(list[index], list[minIndex]); //function call
  }

  //Display the array in descending order
  cout<<"The scores in descending order are ";

  for(int num = 0; num < size; num++)
  {
    cout<<list[num]<<" ";
  }
  cout<<endl;

当我运行程序时,算法不会对任何内容进行排序,它会显示相同的精确数组而没有任何变化。

1 个答案:

答案 0 :(得分:0)

selectionSort

for(int index2 ; index2 < size; index2++)

必须

for(int index2 = index+1; index2 < size; index2++)

否则,当将其用作 list 的索引时,它尚未初始化且行为未定义。

之后:

#include <iostream>
using namespace std;

void selectionSort(int list[], int size)
{
  //Display variables
  int minIndex, minValue, num;

  //Calculate the array in descending order
  for(int index = 0; index < size; index++)
  {

    minValue = list[index];
    minIndex = index;

    for(int index2 = index+1; index2 < size; index2++)
    {
        if(list[index2] < minValue)
        {
            minValue = list[index2];
            minIndex = index2;
        }
    }
    swap(list[index], list[minIndex]); //function call
  }

  //Display the array in descending order
  cout<<"The scores in descending order are ";

  for(int num = 0; num < size; num++)
  {
    cout<<list[num]<<" ";
  }
  cout<<endl;
}

int main()
{
  int v[] = { 1,8,6,9,0,2,3};

  selectionSort(v, (int) (sizeof(v)/sizeof(int)));
  return 0;
}

编译与执行

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra c.cc
c.cc: In function ‘void selectionSort(int*, int)’:
c.cc:7:27: warning: unused variable ‘num’ [-Wunused-variable]
   int minIndex, minValue, num;
                           ^~~
pi@raspberrypi:/tmp $ ./a.out
The scores in descending order are 0 1 2 3 6 8 9 

正如编译器所说的那样,可以删除第一个 num ,也可以不用在中重新定义它


  

当我运行程序时,算法不会对任何内容进行排序,它会显示相同的精确数组而没有任何变化。

以及以上更正后的评论:

  

更改它,但我仍然得到相同的结果。

一个可能的原因是,您定义了自己的 swap ,而该定义不执行 这样的操作:

void swap(int a, int b)
{
    int c = a;

    a = b;
    b = c;
}

而不是例如

void swap(int & a, int & b)
{
    int c = a;

    a = b;
    b = c;
}

或使用课程模板