ruby - 创建一个几乎排序的数组

标签 ruby algorithm sorting

我想尽可能高效地创建一个“几乎排序”的数组(为了探索列表中随机细微变化的影响,我希望经常调用这个例程)。

我有 Ruby 代码可以做我想做的事:

sortme = [ 'X','A','B','W','S','J','7','9','Q','E' ]
n = sortme.length

correctly_sorted = sortme.sort
# ["7", "9", "A", "B", "E", "J", "Q", "S", "W", "X"]

# Specific to this case, I'd like the disorder to be strongest at the
# start of the array. In general, I would like to be able to control
# it, in relation to the sorted positions.
sort_adjust = Array.new( n ) { |i| i + ( rand() * 50 ) / (i+10) }

adjust_indexes = (0...n).sort_by { |i| sort_adjust[i] }
# e.g. [0, 2, 1, 3, 4, 5, 6, 7, 9, 8]

almost_sorted = adjust_indexes.map { |i| correctly_sorted[i] }

# Example output
# ["7", "A", "9", "B", "E", "J", "Q", "S", "X", "W"]

我的解决方案执行两个 sort,一个 map,并调用 rand() N 次来填充一个临时数组。有什么方法可以减少对 Array 的方法调用次数,并提高效率吗?或者减少我调用 rand() 的次数,但仍然可以控制项目的洗牌?

最佳答案

如何应用标准和高效array shuffling algorithm , 但添加随机化?

基本算法为每个位置 i 选择一个随机位置 n>=j>=i 来交换值。相反,决定以概率 p 进行交换。对于 p=1,您有标准的改组算法(其中所有排列出现的可能性相同),对于 p=0,数组将保持排序。

关于ruby - 创建一个几乎排序的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21111242/

相关文章:

ruby-on-rails - 了解 Ruby 最重要的事情是什么?

c++ - 冒泡排序不传递数据或不起作用

php - 如何通过 PHP 中的内部数组的字段之一对多维数组进行排序?

javascript - 在没有 Math.max() 的情况下查找一串数字中的最大值

algorithm - 寻路的扩展 - 最少转弯的路径

javascript - 在 true 或 false 中相等数量的值之间排序的函数

ruby-on-rails - 获取访问 token !在 Google API 中—— "Missing authorization code."

ruby-on-rails - Rails 调试方法只输出 !binary 值

javascript - 使用 ISO V2 Coated 等颜色配置文件将 CMYK 颜色转换为 RGB?

java - 使用堆栈查找二叉搜索树的每个藤蔓的所有节点的非递归方法