如何使用选择排序按三个不同的方面排序
Posted
技术标签:
【中文标题】如何使用选择排序按三个不同的方面排序【英文标题】:How to use selection sort to sort by three different aspects 【发布时间】:2021-12-25 23:35:36 【问题描述】:我有一个由学生组成的学生班级
-
姓氏
名字
生日
身份证
课程
电话号码
我必须使用选择排序来按这三个属性对给定的学生列表进行排序:
-
生日
姓氏
名字
我什至不知道从哪里开始,因为所有在线示例都展示了如何对数字数组进行排序。这就是我现在所拥有的,这绝对是不正确的。
public void MinMax(StudentsRegister other)
StudentsRegister AllYearStudents = new StudentsRegister();
for (int i = 0; i < AllYearStudents.StudentsCount() - 1; i++)
int smallest = i;
for (int j = i + 1; j < AllYearStudents.StudentsCount(); j++)
if (AllYearStudents.Get(j) < other.Get(smallest))
smallest = j;
【问题讨论】:
嗨@rokenga,你能提供输入和预期输出吗?您是要按所有三个属性排序,还是先使用DOB
搜索它,如果DOB
相同,则使用LastName
。如果DOB
和LastName
都相同,那么FirstName
@PrasadTelkikar 如果我正确理解了这个问题,我想按所有三个属性排序,不管是升序还是降序。
@rokenga 你是说这个yourList.OrderBy(x => x.Birthdate).OrderBy(x => x.LastName).OrderBy(x => x.FirstName)
?
@viveknuna 我需要使用选择排序
@CaiusJard 感谢您的改进
【参考方案1】:
好的,这显然是家庭作业,所以我不打算这样做,但我不介意指点。您必须填写空白
您拥有的代码似乎是合理选择排序算法的一部分,只是它没有交换代码。这是我从 tutorialspoint.com 借来的算法:
for (int i = 0; i < n - 1; i++)
smallest = i;
for (int j = i + 1; j < n; j++)
if (arr[j] < arr[smallest])
smallest = j;
temp = arr[smallest];
arr[smallest] = arr[i];
arr[i] = temp;
数组是什么并不重要,只要arr[j] < arr[smallest]
可以解决。您只将其视为整数数组,但如果您有一组学生,那么您只想知道“是这个学生比那个学生低,根据……”。问题是,对于这项作业,您必须更改在“学生 X 小于学生 Y”选项期间比较的字段
如果我们调用一个名为 IsLessThan
的方法,而不是 arr[j] < arr[smallest]
,那会怎样。它可能需要两个学生并比较他们的姓氏:
public bool IsLessThan(Student x, Student y)
return x.LastName.CompareTo(y.LastName)<0;
请记住,我们想要的只是一个布尔判定“x 小于 y”——对于整数,即“2 小于 3”。姓氏是“琼斯小于史密斯”。
for (int i = 0; i < n - 1; i++)
smallest = i;
for (int j = i + 1; j < n; j++)
if ( IsLessThan(arr[j], arr[smallest]) ) //look, I've swapped out one bool test for another bool test
smallest = j;
temp = arr[smallest];
arr[smallest] = arr[i];
arr[i] = temp;
使用只是一组学生(不是你喜欢的 StudentsRegister 类),只是按姓氏排序..
现在.. 当它起作用时,想想“我们如何扩展它以便它按名字、姓氏或出生日期工作?”。如果我们在 IsLessThan 可以访问的某个地方有一些变量,如果该变量是一个东西,那么 lastname 将被比较,如果变量是另一个东西,那么 firstname 将被比较,如果该变量是第三个东西,那么出生日期将被比较。这意味着切换都内置在 IsLessThan 中
一旦你完成了这件事,也许你会喜欢使用多态方法,创建一个具有 IsLessThan 方法的 StudentComparer.. 然后是一个扩展 StudentComparer 并覆盖 IsLessThan 并比较生日的 StudentBirthdateComparer,以及另一个StudentLastNameComparer 扩展了 StudentComparer 并使用姓氏比较覆盖 IsLessThan..
但要分阶段进行,否则你会迷失方向
【讨论】:
我已经尝试编写 IsLessThan for last names 方法,但我得到一个编译器错误 CS0019 已修复,对此感到抱歉 谢谢,成功了!以上是关于如何使用选择排序按三个不同的方面排序的主要内容,如果未能解决你的问题,请参考以下文章