1

バブルソート (Student::name の学生 [] の降順と Class の classes[] 配列をソート) を使用して、同じ関数で構造体の 2 つの配列 (配列の 1 つは他の構造体のメンバー) をソートするにはどうすればよいですか? ::題名?

struct Class
{
    string title; 
    int units;
    char grade;

};
struct Student
{
    string name;
    double gpa;
    Class classes[500];
};

主に:

Student students[SIZE];

バブルソートを使用してソートする必要がある構造体の配列をそれぞれ含む構造体の配列をソートしようとしています。私のソート機能を以下に貼り付けます。正しくソートされず、タイトルに従って構造体 classes[] の内部配列が正しくソートされ、for ループの最初の繰り返しで外部配列 st[] が正しくソートされます。2 回目の反復で st[] の要素が交換されたため、最初の要素がソートされません。b/c currentStu は配列の 2 番目の要素に設定されています。

void sort_name(Student st[], int numValues)
{
  int currentStu = 0;
  int currentClass = 0;

  for(currentStu = 0; currentStu < numValues; currentStu++)
  {
        for(currentClass = 0; st[currentStu].classes[currentClass].title != ""; currentClass++)
        {
            bubbleUpClass(st, currentClass, currentStu);
        }

        bubbleUpLastName(st, currentStu, numValues - 1);
  }
}
4

1 に答える 1

2

実際には学生の 2D 配列はありませんが、これは (全体として) 良いことです。2 つの別々の並べ替えプロセスを適用する必要があり、それらは完全に独立して適用できます。

  1. 生徒のリストを反復処理して、各クラスのリストを並べ替える必要があります (生徒ごとに 1 つ)。特定の学生が何クラスを取っているかをどうやって知るかは明確ではありませんが、それはあなたが解決する問題です。これは、他の並べ替え操作の前後 (ただし、途中ではない) に行うことができます。興味があれば、すぐに並列化できます。生徒のリストを N 個のスレッドに分割して、各スレッドに適切な生徒のセットを割り当てることができます。

  2. 学生のリスト全体を並べ替える必要があります。この操作は、生徒の配列全体 (または、少なくとも、その配列の一部) に影響します。この並べ替えは、他の並べ替え操作の前または後に (実行中ではなく) 実行します。

2 つの別個のソート関数が必要になります。または、標準 C 関数の設計を借りる場合は、qsort()2 つの別個のコンパレータ関数と 1 つのソート アルゴリズムが必要になります。

したがって、2 つの並べ替え操作を組み合わせようとしないでください。それらを別々に行います。

于 2012-11-03T00:04:15.690 に答える