你能将冒泡排序表述为幺半群或半群吗?

2023-11-25

给出以下冒泡排序的伪代码

procedure bubbleSort( A : list of sortable items )
   repeat     
     swapped = false
     for i = 1 to length(A) - 1 inclusive do:
       /* if this pair is out of order */
       if A[i-1] > A[i] then
         /* swap them and remember something changed */
         swap( A[i-1], A[i] )
         swapped = true
       end if
     end for
   until not swapped
end procedure

这是 Scala 冒泡排序的代码

def bubbleSort[T](arr: Array[T])(implicit o: Ordering[T]) {
  import o._
  val consecutiveIndices = (arr.indices, arr.indices drop 1).zipped
  var hasChanged = true
  do {
    hasChanged = false
    consecutiveIndices foreach { (i1, i2) =>
      if (arr(i1) > arr(i2)) {
        hasChanged = true
        val tmp = arr(i1)
        arr(i1) = arr(i2)
        arr(i2) = tmp
      }
    }
  } while(hasChanged)
}

这是 Haskell 的实现:

bsort :: Ord a => [a] -> [a]
bsort s = case _bsort s of
               t | t == s    -> t
                 | otherwise -> bsort t
  where _bsort (x:x2:xs) | x > x2    = x2:(_bsort (x:xs))
                         | otherwise = x:(_bsort (x2:xs))
        _bsort s = s

是否可以将其表示为幺半群或半群?


我使用的手机网络连接状况不佳,但情况依然如此。

tl;dr冒泡排序是插入排序,是对有序列表的幺半群进行合并的幺半群“粉碎”。

有序列表形成一个幺半群。

newtype OL x = OL [x]
instance Ord x => Monoid (OL x) where
  mempty = OL []
  mappend (OL xs) (OL ys) = OL (merge xs ys) where
    merge [] ys = ys
    merge xs [] = xs
    merge xs@(x : xs') ys@(y : ys')
       | x <= y = x : merge xs' ys
       | otherwise = y : merge xs ys'

插入排序由下式给出

isort :: Ord x => [x] -> OL x
isort = foldMap (OL . pure)

因为插入正是将一个单例列表与另一个列表合并。 (合并排序是通过构建平衡树,然后执行相同的 FoldMap 来给出的。)

这与冒泡排序有什么关系?插入排序和冒泡排序具有完全相同的比较策略。如果将其绘制为由比较和交换框组成的排序网络,您可以看到这一点。在这里,数据向下流动,框 [n] 的较低输入向左移动:

| | | |
[1] | |
| [2] |
[3] [4]
| [5] |
[6] | |
| | | |

如果您按照上述编号给出的顺序执行比较,将图切割为 / 切片,您将得到插入排序:第一个插入不需要比较;第一个插入不需要比较;第二个插入不需要比较。第二个需要比较1;第三个2,3;最后4、5、6。

但如果相反,你切成\片......

| | | |
[1] | |
| [2] |
[4] [3]
| [5] |
[6] | |
| | | |

...你正在进行冒泡排序:第一次通过 1,2,3;第二遍4,5;最后一次通过 6.

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

你能将冒泡排序表述为幺半群或半群吗? 的相关文章

  • 如何对其中包含自定义对象的 NSMutableArray 进行排序?

    我想做的事情看起来很简单 但我在网上找不到任何答案 我有一个NSMutableArray对象 假设它们是 Person 对象 我想排序NSMutableArray通过 Person birthDate 这是一个NSDate 我认为这与这个方
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 如何在 PHP 中对数组和数据进行排序?

    这个问题旨在作为有关 PHP 中数组排序问题的参考 人们很容易认为您的特定案例是独特的并且值得提出新问题 但大多数实际上只是此页面上的解决方案之一的微小变化 如果您的问题因与此问题重复而被关闭 请仅在您能解释为什么它与以下所有问题显着不同的
  • 如何按值降序对哈希进行排序并在 ruby​​ 中输出哈希?

    output sort by k v v reverse 和钥匙 h a gt 1 c gt 3 b gt 2 d gt 4 gt a gt 1 c gt 3 b gt 2 d gt 4 Hash h sort 现在我有这两个 但我试图按值
  • 搜索/排序算法 - 是否有类似 GoF 的列表?

    我是一名自学成才的开发人员 坦率地说 我不太擅长找出在任何特定情况下使用哪种搜索或排序算法 我只是想知道是否有设计模式 esque 列出了以太坊中可用的常见算法 供我添加书签 就像是 算法名称 带有别名 如果有的话 它解决的问题 大O成本
  • 按序列大小对 fasta 进行排序

    我目前想按序列大小对 hudge fasta 文件 10 8 行和序列 进行排序 fasta 是生物学中用于存储序列 遗传或蛋白质 的明确定义的格式 gt id1 序列 1 可以位于多行 gt id2 序列2 我运行了一个提供 tsv 格式
  • Haskell 中的实例声明

    我有这两个功能 primes sieve 2 where sieve p xs p sieve x x lt xs x mod p gt 0 isPrime number number 1 null x x lt takeWhile x g
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 无点镜头创建不进行类型检查

    在函数中test 我遍历一个列表 从它的成员生成镜头 然后打印一些数据 当我使用有针对性的呼叫风格时 这会起作用 当我使其成为无点时 它无法进行类型检查 为什么会出现这种情况 我该如何解决这个问题 在我看来 GHC 并没有保留排名较高的信息
  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法
  • 在 MongoDB 中,如何根据嵌入对象中的属性对文档进行排序?

    在我的产品集合中 我可以找到已在 GB 地区发布的所有产品 gt db products find release region GB pretty id foo release region GB date ISODate 2012 03
  • 如何在不使用 LINQ 的情况下按降序对 FileInfo 对象数组进行排序

    我必须降级我的代码才能在 NET 2 0 上工作 因为它不支持 LINQ 目前 该代码对数组进行排序FileInfo对象由他们FullName属性 使用 LINQ 如下所示 Dim files As FileInfo files files
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 自动过滤/排序列表框项目 (Windows Phone)

    我想确保添加到列表框中的项目根据每个项目的序列号按升序排序 例如 1 项目 2 项目 4 项目 3 项目应根据其编号自动排序 1 2 3 10 这是 C 源代码 namespace XeroQuiz public partial class
  • 如何按某些属性对对象列表进行排序

    我有简单的课 public class ActiveAlarm public long timeStarted public long timeEnded private String name private String descrip
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d

随机推荐

  • 如何通过 VirtualBox 运行 Windows 8 Phone 模拟器?

    首先 我不确定我的计算机是否可以处理 VirtualBox 和 Windows 8 手机模拟器 因为没有运行模拟器的按钮 运行 Windows Phone 8 和 VirtualBox 模拟器是否有特定要求 从已安装的 Windows Ph
  • 在 mutate_at 中使用 case_when

    我想用case when within mutate at 如下例所示 mtcars gt mutate at vars vars vs am funs funs case when in c 1 0 9 TRUE in c 2 20 20
  • 正则表达式匹配单个新行。正则表达式匹配双新行

    我正在尝试构建一个正则表达式来匹配一个单独的换行符 n 同样 我需要另一个正则表达式来匹配双换行符 n n 不属于较长的换行符 例如 n n n or n n n n n n etc n n and n n n 匹配太多 它们匹配较长换行符
  • 使用 Linq to GroupBy 和 Sum 数据表

    你好 我有一个这样的数据表 Id Amount 1 Amount 2 Amount 3 1 2 2 2 12 4 6 4 12 6 6 5 22 7 2 1 22 7 2 2 我需要像这样获取我的数据表 Id
  • 使用 CSS font-family 选择不适用于 Android 的 Droid 字体

    我发现以下 HTML 代码在 Android 上不起作用 它只会使用默认字体 Droid Sans 在桌面上它可以按预期工作 p style font family none v nd whisky i tequila pre fix p
  • 使用/ jQuery 滚动到特定元素

    我有一个很长的嵌套 div 列表 我在查询字符串上传递特定元素 实际上是段落元素 的 ID 并打开其 div 和父级 onload 但是 列表太长 有时打开的元素隐藏在窗口底部下方 如何自动滚动用户的浏览器窗口以使显示的元素位于屏幕顶部 您
  • JavaScript 中的有效属性名称、属性分配和访问

    更新的问题 到底什么才是 Javascript 中有效的属性名称 各种财产分配方式有何不同 属性名称如何影响属性访问 Note 我最初问题的答案 见下文 有助于澄清一些事情 但也带来了新的麻烦 现在我有机会更加熟悉 JavaScript 我
  • 如何备份和恢复 Delphi 设置? [复制]

    这个问题在这里已经有答案了 可能的重复 如何迁移 Delphi 或克隆 Delphi 注册表设置 我很快需要格式化我的电脑 但我已经按照我想要的方式完美设置了 IDE 和环境设置 以及我安装的一些组件 显然 格式化并重新安装 Windows
  • ASP.NET MVC 中控制器的内置基类:Controller 还是 ControllerBase?

    ASP NET MVC 中控制器的内置基类是什么 System Web Mvc Controller 还是 System Web Mvc ControllerBase 在谷歌搜索后我不清楚 On ASP NET 控制器是从 System W
  • asp.net core mvc 密码验证器

    在asp net core MVC中自定义密码验证规则的简单方法是什么 这个问题就像有人在这里遇到的一样如何更改 ASP Net MVC Identity 2 中的密码验证 唯一的区别是我正在使用asp net核心MVC 最新版本 使用 V
  • 交互式输入标题,并使用捕获在其下放置条目

    使用如下所示的捕获模板 我可以将条目添加到文件中的不同标题中 如何在捕获期间手动输入标题 而不是像我现在所做的那样将每个标题设置为 emacs 文件中的一个键 setq org capture templates l Log entry f
  • 有没有办法将 matplotlib 图旋转 45 度?

    我正在寻找一种方法 将 matplotlib pyplot Python 库 中生成的绘图旋转 45 度 例如 这样您就可以得到菱形而不是正方形 有人知道这是否可以做到吗 我能想到的一种方法是对所有数据使用旋转过滤器 使其看起来旋转 但绘图
  • 列表视图中的单选按钮

    我在列表视图格式中显示刺痛列表 我使用默认列表视图并使用放置了一个单选按钮simple list item single choice 但这在右侧显示了单选按钮 我想在左侧显示单选按钮 是否可以使用默认列表视图在左侧显示单选按钮 simpl
  • 实现Hadoop的Writable接口的枚举值

    假设我有一个枚举 public enum SomeEnumType implements Writable A 0 B 1 private int value private SomeEnumType int value this valu
  • selectedIndex 在回发期间丢失 - ASP.NET

    我有一个列表框控件
  • iOS 在提交应用程序之前链接到应用程序商店

    我正在为我的 iPhone 应用程序构建一个 关于 控制器 我看到其他应用程序成功地将 市场价格 链接包含在其 关于 控制器中 我是否可以预测我的链接是什么 以便我可以在应用程序的第一个版本中对其进行硬编码 而不是上传 找出链接 发布更新
  • 元刷新重定向到顶部框架

    我有以下代码 Body of this page 这是行不通的 我用谷歌搜索了这个并得出了相同的结论 这应该有效 但事实并非如此 任何人都可以帮我解决
  • 如何在 Rails 中构建由多个模型组成的 JSON 响应

    一 想要的结果 I have User and Item楷模 我想构建一个如下所示的 JSON 响应 user username Bob foo whatever bar hello items id 1 name one zim plan
  • 在 JavaScript 中加入 2 个“线程”

    如果我有一个 ajax 调用关闭获取 通过回调 然后同时运行一些其他代码 当前两个函数完成后 我怎样才能有第三个函数被调用 我确信轮询很容易 setTimeout 然后检查一些变量 但我宁愿回调 是否可以 您可以为 AJAX 调用和同时运行
  • 你能将冒泡排序表述为幺半群或半群吗?

    给出以下冒泡排序的伪代码 procedure bubbleSort A list of sortable items repeat swapped false for i 1 to length A 1 inclusive do if th