Сортировка выбора не захватывает последний элемент в массиве - PullRequest
0 голосов
/ 29 апреля 2020
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;
}

Сортировка выбора, кажется, не захватывает последний элемент в массиве. Существует два параллельных массива, один с именами, а другой с идентификаторами, но похоже, что фамилия в массиве имен учеников не зарегистрирована в сортировке. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 29 апреля 2020

Тело внешнего l oop должно выглядеть как минимум как

  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 ) 
...