ruby - 我的选择排序算法有什么问题?

标签 ruby algorithm sorting

对于受过训练的眼睛来说,答案可能是显而易见的,但我现在已经看了几个小时的书,我的眼睛很疲劳,而且我似乎看不到错误。

下面是我写的两个选择排序的实现,都没有正确排序输入。你可以play with this code在在线口译员上。

def selection_sort_enum(array)
  n = array.length - 1

  0.upto(n - 1) do |i|
    smallest = i

    (i + 1).upto(n) do |j|
      smallest = j if array[j] < array[i]
    end

    array[i], array[smallest] = array[smallest], array[i] if i != smallest
  end
end

def selection_sort_loop(array)
  n = array.length - 1
  i = 0
  while i <= n - 1
    smallest = i
    j = i + 1
    while j <= n
      smallest = j if array[j] < array[i]
      j += 1
    end
    array[i], array[smallest] = array[smallest], array[i] if i != smallest
    i += 1
  end
end

这是第一个实现的测试,selection_sort_enum:

puts "Using enum:"
a1 = [*1..10].shuffle
puts "Before sort: #{a1.inspect}"
selection_sort_enum(a1)
puts "After sort: #{a1.inspect}"

下面是第二个实现的测试,selection_sort_loop:

puts "Using while:"
a2 = [*1..10].shuffle
puts "Before sort: #{a2.inspect}"
selection_sort_enum(a2)
puts "After sort: #{a2.inspect}"

这是第一个实现的输出,selection_sort_enum:

Using enum:
Before sort: [7, 5, 2, 10, 6, 1, 3, 4, 8, 9]
After sort:  [4, 3, 1, 9, 5, 2, 6, 7, 8, 10]

这是第二个实现的输出,selection_sort_loop:

Using while:
Before sort: [1, 10, 5, 3, 7, 4, 8, 9, 6, 2]
After sort:  [1, 2, 4, 3, 6, 5, 7, 8, 9, 10]

最佳答案

在这两个代码片段中,您都在与索引i 而不是索引smallest 进行比较。

这应该有效:

def selection_sort_enum(array)
  n = array.length - 1

  0.upto(n - 1) do |i|
    smallest = i

    (i + 1).upto(n) do |j|
      smallest = j if array[j] < array[smallest]
    end
    array[i], array[smallest] = array[smallest], array[i] if i != smallest
  end
end

def selection_sort_loop(array)
  n = array.length - 1
  i = 0
  while i <= n - 1
    smallest = i
    j = i + 1
    while j <= n
      smallest = j if array[j] < array[smallest]
      j += 1
    end
    array[i], array[smallest] = array[smallest], array[i] if i != smallest
    i += 1
  end
end

输出:

Using enum:
Before sort: [5, 6, 7, 9, 2, 4, 8, 1, 10, 3]
After sort: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Using while:
Before sort: [6, 5, 9, 2, 1, 3, 10, 4, 7, 8]
After sort: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

解决方案链接:http://ideone.com/pKLriY

关于ruby - 我的选择排序算法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36508975/

相关文章:

ruby-on-rails - Delayed_job 为进程守护进程和 rake 任务返回 "syntax error"

ruby - Google API OAuth 2.0 如何存储应用程序默认凭据

algorithm - 填充两条线之间的区域(不是直线)

algorithm - 找到 a、b 和 c 的值,使得 X^a * Y^b * Z^c 最接近 N 并且 a+b+c 最小

c - 二叉树——通过代码追踪

C 使用 Linux shell 函数

java - 在大型未排序列表中查找 n 个最大值,一次仅处理一页值

ruby - 使用 Mechanize 按标签选择表单字段?

Ruby:有没有办法获取类的封闭模块常量?

sorting - Redis 有序集成员大小和性能