F# 中最优雅的冒泡排序方式是什么?

2024-01-23

F# 中最优雅的冒泡排序方式是什么?

UPDATE

正如其中一个答案所指出的,冒泡排序在函数式语言中一开始就效率不高。一位幽默愤世嫉俗的评论者还指出,冒泡排序仅适用于列表很小且无论如何都已排序的情况。

不过,我很好奇如何在 F# 中编写巧妙的冒泡排序,因为我过去曾在 C#、C++ 和 Java EE 中做过冒泡排序,而且我是 F# 新手。


在函数式语言中使用冒泡排序不是很有效,因为实现必须多次反转列表(对于不可变列表来说,这不能真正非常有效地实现)。

无论如何,Erlang 中的示例可以重写为 F#,如下所示:

let sort l = 
  let rec sortUtil acc rev l =
    match l, rev with
    | [], true -> acc |> List.rev
    | [], false -> acc |> List.rev |> sortUtil [] true
    | x::y::tl, _ when x > y -> sortUtil (y::acc) false (x::tl)
    | hd::tl, _ -> sortUtil (hd::acc) rev tl
  sortUtil [] true l

另一方面,您可以使用可变数组实现相同的算法。这将更加高效,并且在 F# 中,如果需要,您也可以使用数组。以下函数创建数组的副本并对其进行排序。

let sort (arr:'a[]) = 
  let arr = arr |> Array.copy
  let swap i j = let tmp = arr.[i] in arr.[i] <- arr.[j]; arr.[j] <- tmp
  for i = arr.Length - 1 downto 0 do
    for j = 1 to i do
      if (arr.[j - 1] > arr.[j]) then swap (j-1) j
  arr

Tomas

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

F# 中最优雅的冒泡排序方式是什么? 的相关文章

  • Backbone Marionette CompositeView 排序列表 - 在添加时呈现额外的模型

    这是小提琴 http jsfiddle net QhQ8D 10 http jsfiddle net QhQ8D 10 代码在下面 制作一个聊天应用程序 需要一个排序的 连接的用户列表 名称上带有比较器的图形集合连接到 CompositeV
  • 如何检查是否存在可能的路径?

    我正在开发一个基于 javascript 的实验性游戏 玩家必须在二维平铺地图上移动才能退出 请随意检查这个小提琴并演奏 http jsfiddle net moonlife 74vLd 我只是随机放置障碍物 但有时障碍物会挡住玩家和出口之
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • shell脚本中关联数组的时间复杂度

    我想知道在 shell 脚本中使用关联数组时如何构造 实现 另外 我想知道基于 shell 脚本的关联数组的时间复杂度是否是最佳的 因为我们可以使用字母和数字作为它们各自的键 编辑 他们使用什么哈希函数 如果您使用关联数组 则不能通过 使用
  • 给定一个具有多个重复条目的数组,找到一个重复条目 O(N) 时间和常数空间

    我们得到了一个大小为 N 的数组 其中包含 0 到 N 2 范围内的整数 包括 0 和 N 2 该数组可以有多个重复的条目 我们需要在 O N 时间和常量空间中找到重复条目之一 我正在考虑取数组中所有条目的乘积和总和 以及 0 到 N 2
  • Florian 的 Grisu2 算法如何工作?

    我遇到了一个关于将 double 转换为 ascii 的问题 经过搜索 我得到了 Florian 的论文 使用整数快速准确地打印浮点数 http www cs tufts edu nr cs257 archive florian loits
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • 解开 Knuth 的结:如何重构意大利面条式代码?

    这个问题的灵感来自如何将流程图转化为实施 https stackoverflow com questions 36647765它询问如何通过算法消除goto代码中的语句 这answer https stackoverflow com a 3
  • 重新排列数组键 php [重复]

    这个问题在这里已经有答案了 我有这个数组 Array 15 gt 13 1 16 gt Mark one answer 19 gt You see a car on the hard shoulder of a motorway with
  • 将 F# 类型保存到数据库

    A lot http gorodinski com blog 2013 02 17 domain driven design with fsharp and eventstore f 文章数推荐 http fsharpforfunandpr
  • 二维滑动窗口最小值/最大值

    假设我们得到一个大小为 NxN 的像素整数矩阵和一个整数 k 窗口大小 我们需要使用滑动窗口找到矩阵中的所有局部最大值 或最小值 这意味着 如果某个像素与其周围窗口中的所有像素相比具有最小 最大 值 则应将其标记为最小 最大 有一种著名的滑
  • 有没有时间复杂度为O(N)的排序算法?

    大多数排序算法的复杂度为 O NN 或 O NlogN 来实现结果 但是 对于特定的输入集 有些算法的复杂度为 O N 我想知道是否有一种排序算法在所有情况下都具有 O N 的复杂度 如果您只能比较 检查两个项目是否为 正在排序的值 那么您
  • 如何对对象进行排序? (画家算法)

    所以我有 4 个矩形形状 我正在尝试应用排序算法 画家算法 https en wikipedia org wiki Painter 27s algorithm 来知道我需要先绘制哪些形状 在 3d 中 然后绘制哪个形状 Note 相机位于右
  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • 数量重新分配逻辑 - 具有外部数据集的 MapGroups

    我正在研究一种复杂的逻辑 需要将数量从一个数据集重新分配到另一个数据集 在例子中我们有Owner and Invoice 我们需要从数量中减去Invoice准确地Owner匹配 在给定汽车的给定邮政编码处 减去的数量需要重新分配回同一辆车出
  • 如何重载比较器以使用 UTF-8 和不同区域设置进行排序

    我有一个数据集合 Alphabet Zend wiczenia 结果collection sort I get Alphabet Zend wiczenia 如何超载comparator使用 UTF 8 和不同的语言环境进行排序 你需要设置
  • 我正在尝试寻找“调酒师算法”

    我正在解决旧编程竞赛中的一些示例问题 在这个问题中 我们输入了我们有多少调酒师以及他们知道哪种配方 每杯鸡尾酒的制作时间为 1 分钟 我们需要计算是否可以在 5 分钟内使用所有调酒师完成订单 解决这个问题的关键是尽可能高效地分配鸡尾酒 这就
  • F# 尝试处理未处理的异常

    在下面的代码中 我想读取一个文件并返回所有行 如果存在 IO 错误 我希望程序退出并将错误消息打印到控制台 但程序仍然遇到未处理的异常 对此的最佳实践是什么 我想我不需要Some None因为无论如何我都希望程序在错误时退出 谢谢 let

随机推荐

  • 如何在 using 语句中使用对象初始值设定项?

    有没有什么方法可以重构此代码 以便不必使用临时变量 而仍然使用与对象初始值设定项关联的语法糖 FrmSomeForm someTempForm new FrmSomeForm SomePropA A SomePropB B SomeProp
  • Go 闭包变量作用域

    我正在阅读 CreateSpace Go 2012 编程简介 在第 86 页我发现了这个邪恶的魔法 func makeEvenGenerator func uint i uint 0 return func ret uint ret i i
  • TypeScript - 将动态属性名称传递给子级

    我正在开发一个带有嵌套路由的路由库 我试图定义一个推断父路径的子处理函数 原因是我有另一种类型 可以从字符串推断动态路径参数 例如 users id to id string 因此 我希望能够将推断的路径参数从父路由传递到每个子路由处理函数
  • 使用 Jasmine 在 Angular 5 中进行单元测试模型绑定

    我正在尝试编写一个单元测试来测试从组件方法调用返回的 JSON 数据是否成功绑定到打字稿模型 我的模型如下所示 export interface IPlayerAccount playerId number name string phon
  • 如何从 TFS 源代码管理中排除特定文件

    我们有多个配置文件 app DEV config app TEST config 等 和一个将正确的配置文件复制到 app config 的预构建事件 显然 配置特定文件位于源代码管理中 但目前 App Config 也是如此 但不应该如此
  • 从后台工作程序中的循环更新文本框

    我知道这个问题有人问过 至少从我到目前为止在这里发现的情况来看 但我无法真正理解它 已经尝试过 msdn 的示例 但仍然没有成功 这是我想要做的 我有一个连接到 TLL 标尺的 USB 计数器 我想在循环中不断读取值并将读数写入文本框而不阻
  • 如何从方法返回对对象的 const 引用? [复制]

    这个问题在这里已经有答案了 public Item getItem ulong itemId Item item items itemId return item 现在的问题是 被调用者getItem必须能够检索以下信息item持有 但不修
  • 多处理代码重复运行

    所以我希望使用 python 多处理模块创建一个进程 我希望它成为更大脚本的一部分 我还想从中得到很多其他东西 但现在我会满足于此 我从以下位置复制了最基本的代码多处理文档 https docs python org 3 6 library
  • 在 ExtJS 4 中具有相同视图并多次存储的最佳实践

    我想在 ExtJS 应用程序中同时拥有不同商店的同一视图的不同实例 目前 我在视口中创建了同一视图 Ext view View 的多个实例 但是在每个视图中都有不同的商店的最佳实践是什么 我发现的每个示例都在使用控制器的stores Con
  • MapKit (Swift 4) Xcode 9.2 - “无法从角 4 插入合法归属”

    我正在做一个处理 MapKit 的项目 我的问题是 当我运行该应用程序时 我收到 无法从第 4 角插入法律归属 的消息 错误 我可以采取什么解决方案来解决这个问题 error https i stack imgur com jw7rk pn
  • 使用 Tf Estimator 时如何获得可训练变量计数?

    我使用 tf 估计器框架创建了 CNN 分类器模型 但是 我无法访问模型中定义的变量 tf trainable variables 始终返回 0 如何使用 tf 估计器访问变量 特别是 我如何获得参数总数的计数 将所有变量的维度相加 谢谢
  • 自动使用相对于函数调用位置的 __LINE__ 和 __FILE__

    我有一个函数log text 这一切所做的就是写 text到数据库 我想包括 LINE and FILE 但不想像我现在那样每次都将其作为参数包含在内 function log text file null line null write
  • 无法使用面向 x64 的 VC++/VS2010 进行编译:LNK1158:无法运行 cvtres.exe

    作为一名 C 开发人员 我最近决定尝试编写一些 C 程序 主要是因为我发现了一个我想使用的有趣的 C API 几天前我写了一个非常简单的程序 在 x64 目标平台上编译它 运行它 一切都很顺利 然而 昨天我更改了一些代码 尝试编译它 但链接
  • ruby - 捆绑包安装/更新太慢

    我刚刚在 virtualbox 中运行的虚拟 ubuntu 12 04 32 位上安装了 RVM Ruby Rails 等 现在我遇到了我的第一个 Rails 项目的问题bundle install or bundle update需要很长
  • 连接到不存在的 mongodb 服务器不会抛出异常

    我正在尝试使用 Java 的 MongoDB 驱动程序 所以我只是创建了一个简单的应用程序来连接到 MongoDB 服务器并选择一个数据库 所以我创建了一个实例MongoClient并选择了一个 数据库 try MongoClient cl
  • 查找哪一行重复 data.frame 中的哪一行

    我有一个像这样的数据框 data frame matrix c 11 13 21 23 11 13 11 13 31 33 41 43 31 33 byrow TRUE ncol 3 现在我想知道哪一行是哪一行的重复项 返回具有重复行号最低
  • 将 docx 转换为 markdown 时如何避免 markdown 上的 img 大小标签?

    我正在使用 pandoc 1 16 0 2 转换 docx 文件 一切都很好 除了每个图像之后 尺寸属性在 teh 中显示为文本 media media image4 png width 3 266949912510936in height
  • 我将错误的数组长度传递给了函数。为什么我没有收到错误消息?

    我是初学者 学习c语言大约20天 我一直在使用 Youtube 来做这件事 我看到一个视频 其中有人告诉我 如果将数组传递给函数 那么第二个变量应该是数组的长度 我觉得这是不对的 我尝试了下面给出的代码 include
  • 如何使用 SSMS 连接到 SQL Server CE 文件

    我正在使用 SSMS 2012 并尝试连接到 Orchard 创建的 SDF 根据这个答案 https stackoverflow com a 1072324 128217 我应该能够选择SQL Server 精简版 as the 服务器类
  • F# 中最优雅的冒泡排序方式是什么?

    F 中最优雅的冒泡排序方式是什么 UPDATE 正如其中一个答案所指出的 冒泡排序在函数式语言中一开始就效率不高 一位幽默愤世嫉俗的评论者还指出 冒泡排序仅适用于列表很小且无论如何都已排序的情况 不过 我很好奇如何在 F 中编写巧妙的冒泡排