static void Main(string[] args) { Console.Title = "将学生按成绩从低到高排列"; StudentList students = new StudentList(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); } Student temp; //将建堆后的根结点与索引为i的结点交换 for (int i = 19; i >=1; i--) { CreateHeap(students, i); temp = students[0]; students[0] = students[i]; students[i] = temp; } Console.ReadLine(); Console.Clear(); 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(); }
static void Main(string[] args) { Console.Title = "查找指定姓名的学生信息"; Console.WriteLine("学生名单如下:"); StudentList students = new StudentList(20); for (int i = 0; i < 20; i++) { Console.Write(students[i].Name + "\t"); if ((i + 1) % 5 == 0) Console.WriteLine(); } string name; do { Console.WriteLine("请输入要查询的学生姓名:"); name = Console.ReadLine(); int i = 0, count = 0; //顺序查找学生指定学生信息 for (; i < 20; i++) { if (students[i].Name == name) { Console.WriteLine("学号:{0}\t年级:{1}\t成绩:{2}", students[i].Number, students[i].Grade, students[i].Result); count++; } } if (count == 0) Console.WriteLine("无此学生信息!"); } while (name != string.Empty); Console.ReadLine(); }
static void Main(string[] args) { Console.Title = "求学生成绩在前十名的学生"; StudentList students = new StudentList(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(); Student temp; int max = 0; for (int i = 0; i < 10; i++) { max = i; for (int j = i + 1; j < 20; j++) { if (students[j].Result > students[max].Result) max = j;//求成绩最好的学生索引 } //将成绩最好的学生与索引i的学生交换 temp = students[i]; students[i] = students[max]; students[max] = temp; } Console.Clear(); Console.WriteLine("成绩排在前十名的学生信息表:"); for (int i = 0; i < 10; i++) { Console.WriteLine("学号:{0}\t姓名:{1}\t成绩:{2}", students[i].Number, students[i].Name, students[i].Result); } Console.ReadLine(); }
//将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 Main(string[] args) { Console.Title = "查询具有指定成绩的学生信息"; StudentList students = new StudentList(20); Console.WriteLine("学生成绩单如下:"); for (int i = 0; i < 20; i++) { Console.Write(students[i].Result + "\t"); if ((i + 1) % 5 == 0) Console.WriteLine(); } BTreeNode root = new BTreeNode(students[0]); //创建二叉排序树根结点 for (int i = 1; i < 20; i++) { CreateBinarySortingTree(root, students[i]); //根据学生成绩创建二叉排序树 } int result; //在二叉排序树上的查找指定成绩学生信息 do { Console.WriteLine("请输入要查询的学生的成绩:"); if (!int.TryParse(Console.ReadLine(), out result)) result = -1; BTreeNode node = root; bool successful = false; while (node != null) { if (result > node.Student.Result) node = node.RightChild;//查找右子树 else if (result < node.Student.Result) node = node.LeftChild;//查找左子树 else//查找成功 { Console.WriteLine("学号:{0}\t姓名:{1}\t年级:{2}", node.Student.Number, node.Student.Name, node.Student.Grade); successful = true; break; } } if (!successful) Console.WriteLine("无此学生信息!");//查找失败 } while (result != -1); Console.ReadLine(); }
static void Main(string[] args) { Console.Title = "按学生成绩构造哈希表"; StudentList students = new StudentList(20); Console.WriteLine("学生成绩单如下:"); for (int i = 0; i < 20; i++) { Console.Write(students[i].Result + "\t"); if ((i + 1) % 5 == 0) Console.WriteLine(); } //创建哈希表 StudentNode[] hashTable = new StudentNode[5]; for (int i = 0; i < 20; i++) { int index = students[i].Result % 5; //计算哈希地址 if (hashTable[index] == null) hashTable[index] = new StudentNode(students[i], null); else hashTable[index] = new StudentNode(students[i], hashTable[index]); } int result; do { Console.WriteLine("请输入要查询的学生的成绩:"); if (!int.TryParse(Console.ReadLine(), out result)) break; bool successful = false; //标记查找是否成功 StudentNode node = hashTable[result % 5]; //计算哈希地址 while (node != null) { if (node.Student.Result == result) //查找成功 { Console.WriteLine("学号:{0}\t姓名:{1}\t年级:{2}", node.Student.Number, node.Student.Name, node.Student.Grade); successful = true; } node = node.Next; } if (!successful) Console.WriteLine("无此学生信息!"); //查找失败 } while (result != -1); Console.ReadLine(); }
static void Main(string[] args) { Console.Title = "将学生按成绩进行希尔排序"; StudentList students = new StudentList(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); } for (int increment = 5; increment > 0; increment--) { //遍历索引从increment开始的学生信息 for (int i = increment; i < 20; i++) { //如果索引为i的学生成绩大于索引为i-increment的学生成绩 //则前i/increment+1个学生成绩已经有序 if (students[i].Result > students[i - increment].Result) { Student temp = students[i]; int j = i - increment; //将索引为i的学生信息插入到其所在分组中合适的位置 for (; j >= 0 && temp.Result > students[j].Result; j -= increment) { students[j + increment] = students[j]; } students[j + increment] = temp; } } } Console.ReadLine(); Console.Clear(); 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(); }
//建立大根堆 static void CreateHeap(StudentList students, int n) { //从第一个非叶子结点开始遍历 for (int i = (n -1) / 2; i >= 0; i--) { int lChild = i * 2 + 1; //左孩子索引 int rChild = i * 2 + 2; //右孩子索引 int max = i; //最大值索引 //将结点i的学生成绩与其左孩子结点的学生成绩比较 if (students[lChild].Result > students[max].Result) max = lChild; //将结点i的学生成绩与其右孩子结点的学生成绩比较 if (rChild <= n && students[rChild].Result > students[max].Result) max = rChild; //将成绩最好的结点调整到索引为i的结点上 if (max != i) { Student temp = students[i]; students[i] = students[max]; students[max] = temp; } } }
static void Main(string[] args) { Console.Title = "查找指定学号的学生信息"; Console.WriteLine("学生学号列表如下:"); StudentList students = new StudentList(20); for (int i = 0; i < 20; i++) { Console.Write(students[i].Number + "\t"); if ((i + 1) % 5 == 0) Console.WriteLine(); } int number; do { Console.WriteLine("请输入要查询的学生学号:"); if (!int.TryParse(Console.ReadLine(), out number)) number = 0; int middle = 0; //用于查找的对象索引 int low = 0; //查找区域索引下限 int high = 19; //查找区域索引上限 int flag = -1; //用于标记查找成功时的索引,如果查找失败则为-1 //折半查找学生指定学生信息 while(low <= high) { middle = (low + high) / 2; if (number > students[middle].Number) low = middle + 1;//下一次在右半区域中查找 else if (number < students[middle].Number) high = middle - 1;//下一次在左半区域中查找 else { flag = middle;//查找成功,将记录索引存入flag中 break; //跳出查找循环 } } if (flag > 0)//查找成功 Console.WriteLine("姓名:{0}\t年级:{1}\t成绩:{2}", students[flag].Name, students[flag].Grade, students[flag].Result); else Console.WriteLine("无此学生信息!");//查找失败 } while (number != 0); Console.ReadLine(); }
static void Main(string[] args) { Console.Title = "对学生表的前十位学生按成绩排序"; StudentList students = new StudentList(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); } //遍历索引从1开始的学生信息 for (int i = 1; i < 10; i++) { //如果索引为i的学生成绩大于索引为i-1的学生成绩,则前i+1个学生成绩已经有序 if (students[i].Result > students[i - 1].Result) { Student temp = students[i]; int j = i - 1; //将索引为i的学生信息插入到其合适的位置 for (; j >= 0 && temp.Result > students[j].Result; j--) { students[j + 1] = students[j]; } students[j + 1] = temp; } } Console.ReadLine(); Console.Clear(); 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(); }
static void Main(string[] args) { Console.Title = "对学生表的前十位学生按成绩排序"; StudentList students = new StudentList(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); } //正向冒泡排序求最小值 for (int i = 1; i < 20; i++) { //成绩差的上浮 if (students[i].Result > students[i - 1].Result) { Student temp = students[i]; students[i] = students[i - 1]; students[i - 1] = temp; } } //逆向冒泡排序求最大值 for (int i = 19; i > 0; i--) { //成绩好的下沉 if (students[i].Result > students[i - 1].Result) { Student temp = students[i]; students[i] = students[i - 1]; students[i - 1] = temp; } } Console.WriteLine("最好成绩为:{0} 最差成绩为:{1}", students[0].Result, students[19].Result); Console.ReadLine(); }
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(); }
static void Main(string[] args) { Console.Title = "求成绩合格的学生"; StudentList students = new StudentList(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(); int low = 0, high = 19; int result = 60; //合格的成绩 Student temp = students[low]; //第一趟快速排序,将学生按成绩分为大于等于60的和小于60的两部分 while (low < high) { while (low < high && students[high].Result >= result) high--; students[low++] = students[high]; while (low < high && students[low].Result <= result) low++; students[high--] = students[low]; } students[low] = temp; if (temp.Result < result) low++; Console.Clear(); Console.WriteLine("成绩合格的学生信息表:"); for (int i = low; i < 20; i++) { Console.WriteLine("学号:{0}\t姓名:{1}\t成绩:{2}", students[i].Number, students[i].Name, students[i].Result); } Console.ReadLine(); }
static void Main(string[] args) { Console.Title = "将学生信息表顺序倒置"; StudentList students = new StudentList(10); //创建含有10个元素的学生信息表 Console.WriteLine("按顺序输出学生姓名:"); for (int i = 0; i < 10; i++) Console.Write(students[i].Name + "\t"); //将学生表前面的元素与后面的元素互换 for (int i = 0; i < 5; i++) { Student temp = students[i]; students[i] = students[9 - i]; students[9 - i] = temp; } Console.WriteLine("输出学生信息表倒置后的学生姓名:"); for (int i = 0; i < 10; i++) Console.Write(students[i].Name + "\t"); Console.Read(); }