如何使用选择排序按三个不同的方面排序

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。如果DOBLastName 都相同,那么FirstName @PrasadTelkikar 如果我正确理解了这个问题,我想按所有三个属性排序,不管是升序还是降序。 @rokenga 你是说这个yourList.OrderBy(x =&gt; x.Birthdate).OrderBy(x =&gt; x.LastName).OrderBy(x =&gt; 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] &lt; arr[smallest] 可以解决。您只将其视为整数数组,但如果您有一组学生,那么您只想知道“是这个学生比那个学生低,根据……”。问题是,对于这项作业,您必须更改在“学生 X 小于学生 Y”选项期间比较的字段

如果我们调用一个名为 IsLessThan 的方法,而不是 arr[j] &lt; 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 已修复,对此感到抱歉 谢谢,成功了!

以上是关于如何使用选择排序按三个不同的方面排序的主要内容,如果未能解决你的问题,请参考以下文章

按属性过滤器不同选择对产品进行排序

排序(上):冒泡排序插入排序和选择排序

SQL按多列以不同顺序排序后选择奇数行

选择按频率排序的最重要的不同结果

排序算法系列之选择排序

如何使用一个选择器创建一个按多个键排序的 NSSortDescriptor