Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 这是选择排序算法的忠实版本吗?_Ruby_Algorithm_Sorting - Fatal编程技术网

Ruby 这是选择排序算法的忠实版本吗?

Ruby 这是选择排序算法的忠实版本吗?,ruby,algorithm,sorting,Ruby,Algorithm,Sorting,我一直在读一本关于排序算法的入门书。为了解决这个问题,我试着写一个简单的程序来实现这个算法 编辑:我省略了前一个版本中的一行重要内容-见下面的评论 这是我的选择排序: class SelectionSorter attr_reader :sorted def initialize(list) @unsorted = list @sorted = [] end def select(list) smallest = list.first ind

我一直在读一本关于排序算法的入门书。为了解决这个问题,我试着写一个简单的程序来实现这个算法

编辑:我省略了前一个版本中的一行重要内容-见下面的评论

这是我的选择排序:

class SelectionSorter

  attr_reader :sorted

  def initialize(list)
    @unsorted = list
    @sorted = []
  end

  def select(list)
    smallest = list.first
    index = 0
    list.each_with_index do |e,i|
      if e < smallest
        smallest = e
        index = i
      end
    end
    @sorted << list.delete_at(index)
  end

  def sort
    @unsorted.length.times { self.select(@unsorted) }
  end

end
类选择排序器
属性读取器:已排序
def初始化(列表)
@未排序=列表
@排序=[]
结束
def选择(列表)
最小的=列表第一
索引=0
列出每一个带有索引do | e,i的|
如果e<最小
最小的=e
指数=i
结束
结束

@排序我不知道选择排序算法,但我可以看出您的代码不进行排序。在本部分:

list.each_with_index do |e,i|
  if e < smallest
    index = i
  end
end

@unsorted
中获取该元素,并将其推入
@sorted
。你重复这个过程。这不会给您排序。

请尝试在
index=i
之后立即添加
minimest=e
,这样您就可以保留到目前为止找到的最小值的运行记录


我还需要注意的是,选择排序通常是就地实现的,即扫描列表中的位置1-N以获取最小值,然后将其与第一个元素交换,然后对元素2-N、3-N等重复此过程。不需要第二个数组,也不需要从数组中间移除元素。

Aha!我需要更多的测试用例!重新思考!啊哈,好吧-我想知道一个就地实现。我的方法更多的是试图思考整个过程。一旦我准备好了一些测试用例,我会尝试一下。好吧,祝你好运。测试用例很好,你可以从它们导致代码失败的地方学到很多东西。回顾历史,我实际上有一个最小值的运行记录——不知道是怎么掉下来的。有了它,我的测试就通过了。对于不同的实现,你应该有一个单独的问题。好的!对不起!新增问题
class SelectionSorter

  def sort(list)
    sorted_boundary = (0..(list.length)-1)
    sorted_boundary.each do |sorted_index|
      smallest_index = sorted_index
      smallest_value = list[smallest_index]
      comparison = sorted_index + 1
      (comparison..(list.length-1)).each do |next_index|
        if list[next_index] < smallest_value
          smallest_index = next_index
          smallest_value = list[smallest_index]
        end
      end
      unless sorted_index == smallest_index
        list[smallest_index] = list[sorted_index]
        list[sorted_index] = smallest_value
      end
    end
    list
  end

end
list.each_with_index do |e,i|
  if e < smallest
    index = i
  end
end
@sorted << list.delete_at(index)