如何使用二进制搜索C ++从二维数组输出数据?

时间:2016-01-07 01:13:06

标签: c++ arrays

我正在做的一个函数使用二进制搜索来获得具有2行和12列的二维数组。第一行是学生ID,因此总共有12名学生。第二行为每个学生提供相应的GPA。我坚持使用的部分是当用户输入要搜索的学生ID时,使用二进制搜索显示来自2D阵列的12名学生之一的GPA。我已经为二进制搜索提出了这个问题,但是当用户输入要搜索的学生ID时,我认为它不会为学生显示相应的GPA。任何帮助都会很棒!

        void search(double avg[][COLUMNS])
        int number;      // number is the student ID the user entered already
        int first = 0,
        last = MAX - 1,
        mid,
        position = -1;
        int row = 2;
        bool found = false;

        while (!found && first <= last)
        {
            mid = (first + last) / 2;
            if (avg[row][mid] == number)
            {
                cout << "found at index " << mid << endl;
                found = true;
            }
            else if (avg[row][mid] > number)
                last = mid - 1;
            else
                first = mid + 1;
        }

1 个答案:

答案 0 :(得分:1)

对于二进制搜索,您搜索的数据必须进行排序。在您的情况下,在将数组传递给搜索之前,必须按学生ID对2D数组进行排序。

如果数组的deminsions是[2] [12],那么当你row = 2时,你将超出2D数组的范围。 C ++是基于0的索引。如果ID是第一行,您需要执行row = 0。我已经通过一些更改重写了您的代码。

首先:我删除了找到的变量,因为它没有必要(你可以使用低&lt; high和break语句)。

第二:修正了越界索引,假设ID是第一行而GPA是第二行。

第三:通过id搜索。由于你有一个双数组,我使用传入的ID来搜索double。

void search(double students[][COLUMNS], double id){
    int low(0), high(COLUMNS);
    int ID(0), GPA(1);  // Row 1 is ID (index 0), Row 2 is GPA (index 1).

    while (low <= high){
      int mid = (low+high)/2;
      if (students[ID][mid] < id)
        low = mid;
      else if (students[ID][mid] > id)
        high = mid;
      else {
        cout << "Found at index " << mid << " with GPA: " 
             << students[GPA][mid] << endl;
        break;
      }
    }
}

编辑:我可能会建议代替2D数组,创建一个存储学生信息的对象数组。下面的课应该没问题。

class Student{
   public:
     int ID;
     double GPA;
     Student(int id = 0, double gpa = 4.0):ID(id),GPA(gpa){}
     bool operator < (const Student& s){
       return ID < s.ID;
     }
}