【问题标题】:Selection Sort Algorithm in RR中的选择排序算法
【发布时间】:2015-07-06 15:23:02
【问题描述】:

我需要一些帮助来理解这种类型的代码以及这里发生的操作。例如,我们取一个由整数 (8,6,5,4,2,1,9) 定义的向量 x。

这个函数的第一步是检查条件是否给定,这个向量的长度是否大于1。对于x,条件是给定的。 下一步是突出显示该向量中最小值的位置,即 6。但我不明白接下来的步骤中实际发生了什么以及为什么必须将其组合为向量?

selsort <- function(x) {
  if(length(x) > 1) {
    mini <- which.min(x)
    c(x[mini], selsort(x[-mini])) #selsort() somewhere in here -> recursion
  } else x   
}

【问题讨论】:

    标签: r sorting selection


    【解决方案1】:

    在递归中,有两种关键情况:

    基本情况 - 输入直接产生结果

    递归案例 - 输入导致程序再次调用自己

    在您的函数中,基本情况是 x 的长度不大于 1。发生这种情况时,我们只返回 x。当我们到达基本情况时,我们将不再运行该函数,它所做的只是回溯所有以前的递归情况以完成那些selsort() 调用的执行。

    递归的情况是长度大于 1。为此,我们将向量中的最小值与没有最小值的selsort() 的结果相结合。这将持续到我们达到基本情况。因此,我们找到最小值,将其从列表中删除,然后重复上一次运行中的所有值,除了我们选择的值。一旦我们达到了只剩下 1 个元素(最大的元素)的基本情况,我们就没有更多的最小发现要做,所以我们只返回最后一个元素。

    这称为选择排序,因为我们每次都专门选择 1 个元素(最小的元素)。对于大数据,这是低效的,但这是考虑排序的一种自然方式。

    有更高效的排序算法。一种易于理解的好方法是归并排序:Merge Sort in R

    【讨论】:

      【解决方案2】:

      它将最小的数字放在向量的第一个位置,从向量中删除该条目并递归地重复此操作,直到整个向量条目从最小到最大数字排序。

      示例

      第一步

      x <- x1 <- c(8,6,5,4,2,1,9)
      

      向量中最小数字的位置由selsort()which.min() 函数标识。这个数字放在第一位。同时,这个元素被从向量中移除。因此,在下一步中,有

      x2 <- c(8,6,5,4,2,9)
      c(1,selsort(x2))
      

      现在算法在 x2 中搜索最小的数,即 2,将其放在前面并将其从向量中移除,从而导致:

      x3 <- c(8,6,5,4,9)
      c(1,c(2,selsort(x3)))
      

      重复此操作,直到向量的长度等于 1。那么就没有什么可排序的了,返回最后一个数字,也就是初始向量的最大元素。

      这里提到赋值x1,x2,x3...只是为了说明代码的操作顺序。这是在递归函数中隐式完成的,该函数仅使用一个向量 x 并在每次迭代时将其减少一个条目。

      希望这会有所帮助。

      【讨论】:

      • 用操作符c(x[mini]取最小值,这很清楚,但是另一部分selsort(x[-mini]))会发生什么?
      • 非常感谢,我完全明白了。
      猜你喜欢
      • 2021-02-06
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 2019-04-24
      • 2021-02-06
      相关资源
      最近更新 更多