【问题标题】:In-place merge sort practical usage就地归并排序实际用法
【发布时间】:2016-06-06 00:44:46
【问题描述】:

我尝试在这里和那里搜索以找到确切的就地合并排序以及我需要在哪里使用它?但没有找到直接的答案。请通过下面的回答帮助我。

1) 何时何地需要就地合并?就地合并的实际用法。

2) 如果原地合并的输入数组没有排序会发生什么?

3) 在归并排序、原地归并排序和快速排序中,哪个会占用更多内存?

注意:我问的是“std::inplace_merge”,它是一种 stl 算法。

【问题讨论】:

  • 如果您在我的问题朋友们投反对票时在这里添加评论,我将非常高兴。至少您应该有机会知道我的问题有什么问题。如果可能的话,如果这是一个基本问题,请分享材料,并对该问题投反对票。我想要的只是概念。谢谢。

标签: c++ std mergesort in-place


【解决方案1】:

1) 当您想要在 O(nlogn) 时间内对列表进行排序时使用就地合并排序,同时使用比标准合并排序更少的空间。

2) 排序的全部目的是使输入数组排序,因此未排序的输入数组将通过就地合并排序进行排序。

3) Mergesort 使用更多内存,因为它为两个递归调用创建了两个一半大小的新数组。就地合并排序和快速排序应该占用相同的空间,因为它们都是就地的。对于合并排序,就地意味着 O(log n) 额外的空间来保留长度为 n 的数组的相关索引,而不是就地的最严格的 O(1) 含义。快速排序在最坏的情况下会占用 O(nlogn) 额外空间,因为可能存在 O(n) 次递归调用,每个调用都有占用 O(logn) 空间的指针。

希望这会有所帮助。

【讨论】:

  • 小心措辞,“就地”有两个定义。 “在其最严格的形式中,该算法只能拥有恒定数量的额外空间,包括函数调用和指针在内的所有内容......更广泛地说,就地意味着该算法不使用额外空间来操作输入,但可能需要一个小的但非常量的额外空间用于它的操作。通常,这个空间是 O(log n),尽管有时 o(n) 中的任何东西都是允许的。" en.wikipedia.org/wiki/In-place_algorithm
  • @MooingDuck 谢谢,我将编辑我的答案以反映这一点。
  • 快速排序占用 Log(n) 摊销额外内存,O(n) 最坏情况额外内存。我真的不知道有人将“外部”内存用于算法。
  • “外部”是指额外的内存。
  • 快速排序的每个“通过”(至少)在堆栈上获取一个开始指针、一个中间指针和一个结束指针,在最坏的情况下,快速排序的递归深度为 n .这意味着堆栈上至少有 3*n 个指针,这会占用内存。
猜你喜欢
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2013-05-11
  • 2016-11-05
相关资源
最近更新 更多