选择排序未获取数组中的最后一个元素

时间:2020-04-29 15:50:58

标签: c++ selection-sort

void ProcessSort(int studentIDs[], string studentNames[], int num)
{

   for (int i = 0; i < num - 1; i++)
   {
      int mindex = 0; 
      //DO6: finish the inner loop
      //     Hint: it should start from i+1 and go until num-1
      //     if studentNames[j] is greater than studentNames[mindex]
      //     then store j in mindex
      for (int j = i+1; j < num - 1; j++) {
         if (studentNames[mindex] < studentNames[j]) {
            mindex = j;
         }
      }



      //DO7: Swap student names

      SwapNames(studentNames[mindex], studentNames[i]);

      //DO8: Swap student IDs'
      SwapIDs(studentIDs[mindex], studentIDs[i]);


   }
   cout << "Class List sorted by name." << endl;
}

选择排序似乎没有抓住数组中的最后一个元素。有两个并行的数组,一个带有名称,一个带有ID,但似乎学生姓名数组中的姓氏未与该排序一起注册。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

外循环的主体至少应看起来像

  int mindex = i; 
  //DO6: finish the inner loop
  //     Hint: it should start from i+1 and go until num-1
  //     if studentNames[j] is greater than studentNames[mindex]
  //     then store j in mindex
  for (int j = i+1; j < num; j++) {
     if (studentNames[mindex] < studentNames[j]) {
        mindex = j;
     }
  }

这种情况

     if (studentNames[mindex] < studentNames[j]) {

按降序排列。

这是一个演示程序。

#include <iostream>
#include <string>
#include <utility>

void ProcessSort( int studentIDs[], std::string studentNames[], size_t n )
{
    for ( size_t  i = 0; i < n; i++)
    {
        size_t mindex = i; 
        //DO6: finish the inner loop
        //     Hint: it should start from i+1 and go until num-1
        //     if studentNames[j] is greater than studentNames[mindex]
        //     then store j in mindex
        for ( size_t j = i + 1; j < n; j++ ) 
        {
            if ( studentNames[mindex] < studentNames[j] ) mindex = j;
        }

        //DO7: Swap student names
        if ( i != mindex )
        {
            std::swap( studentNames[mindex], studentNames[i] );
            //DO8: Swap student IDs'
            std::swap( studentIDs[mindex], studentIDs[i] );
        }
    }
}

int main() 
{
    int studentIDs[] = { 495, 520, 550, 666 };
    std::string studentNames[] = { "Kyle", "Liam", "Bill", "Michael" };
    const size_t N = sizeof( studentIDs ) / sizeof( *studentIDs );

    for ( size_t i = 0; i < N; i++ )
    {
        std::cout << "( " << studentNames[i] << ", " << studentIDs[i] << " ) ";
    }
    std::cout << std::endl;

    ProcessSort( studentIDs, studentNames, N );

    for ( size_t i = 0; i < N; i++ )
    {
        std::cout << "( " << studentNames[i] << ", " << studentIDs[i] << " ) ";
    }
    std::cout << std::endl;

    return 0;
}

其输出为

( Kyle, 495 ) ( Liam, 520 ) ( Bill, 550 ) ( Michael, 666 ) 
( Michael, 666 ) ( Liam, 520 ) ( Kyle, 495 ) ( Bill, 550 )