//将sts1[begin..end]归并排序为sts2[begin..end]
 static void MergeSort(StudentList sts1, Student[] sts2, int begin, int end)
 {
     Student[] sts3 = new Student[sts1.Length];
     if (begin == end)
     sts2[begin] = sts1[begin];                      //如果只有一个元素则直接将其归并到sts2中
     else
     {
     int divide = (begin + end) / 2;                 //将表分割成两部分
     MergeSort(sts1, sts3, begin, divide);           //对左半部分进行归并排序并存储到sts3中
     MergeSort(sts1, sts3, divide + 1, end);         //对右半部分进行归并排序并存储到sts3中
     Merge(sts3, sts2, begin, divide, end);          //将左右两部分归并到sts2中
     }
 }
 static void Merge(Student[] sts1, Student[] sts2, int begin, int divide, int end)
 {
     int i,j,k,l;
     //将有序的sts1[begin..divide]和sts1[divide+1..end]归并为有序的sts2
     for (i = begin, j = divide + 1, k = begin; i <= divide && j <= end; k++)
     {
     if (sts1[i].Result > sts1[j].Result) sts2[k] = sts1[i++];
     else sts2[k] = sts1[j++];
     }
     //将sts1[begin..divide]剩余部分归并到sts2中
     if (i <= divide) for (l = 0; l <= divide - i; l++) sts2[k + l] = sts1[i + l];
     //将sts1[divide+1..end]剩余部分归并到sts2中
     if (j <= end) for (l = 0; l <= end - j; l++) sts2[k + l] = sts1[j + l];
 }
 //创建二叉排序树
 static void CreateBinarySortingTree(BTreeNode node, Student student)
 {
     if (student.Result < node.Student.Result)           //如果成绩比根结点小
     {
     if (node.LeftChild == null)                     //如果左子树为空
     //创建左孩子结点,并将学生信息添加到该孩子结点中
     node.LeftChild = new BTreeNode(student);
     else                                            //如果左子树不为空
     CreateBinarySortingTree(node.LeftChild, student);//将学生信息添加到左子树中
     }
     else if (student.Result > node.Student.Result)      //如果成绩比根结点大
     {
     if (node.RightChild == null)                    //如果右子树为空
     //创建右孩子结点,并将学生信息添加到该孩子结点中
     node.RightChild = new BTreeNode(student);
     else                                            //如果右子树不为空
     CreateBinarySortingTree(node.RightChild, student);//将学生信息添加到右子树中
     }
 }
        static void Main(string[] args)
        {
            Console.Title = "将学生按成绩进行归并排序";

            StudentList students = new StudentList(20);
            Student[] studentsSort = new Student[20];
            Console.WriteLine("排序前的学生信息表:");
            for (int i = 0; i < 20; i++)
            {
                Console.WriteLine("学号:{0}\t姓名:{1}\t成绩:{2}", students[i].Number, students[i].Name, students[i].Result);
            }
            Console.ReadLine();

            MergeSort(students, studentsSort, 0, 19);

            Console.Clear();
            Console.WriteLine("排序后的学生信息表:");
            for (int i = 0; i < 20; i++)
            {
                Console.WriteLine("学号:{0}\t姓名:{1}\t成绩:{2}", studentsSort[i].Number, studentsSort[i].Name, studentsSort[i].Result);
            }

            Console.ReadLine();
        }
 public BTreeNode(Student student)
 {
     this.Student = student;
 }
 //进队
 public void In(Student student)
 {
     if (Rear == null)
     {
     Rear = new StudentNode(student, null);
     Front = Rear;
     }
     else
     {
     Rear.Next = new StudentNode(student, null);
     Rear = Rear.Next;
     }
 }
        public readonly Student Student; //学生信息

        #endregion Fields

        #region Constructors

        public StudentNode(Student student)
        {
            this.Student = student;
        }
 public StudentNode(Student student, StudentNode next)
 {
     this.Student = student;
     this.Next = next;
 }