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)