【问题标题】:Combining insertion sort and merge sort结合插入排序和归并排序
【发布时间】:2017-05-17 09:12:23
【问题描述】:

我正在考虑优化当前的排序算法。为了让这个过程更快,我想到了使用线程并将数组分成两部分。使用线程同时使用插入排序对两个数组进行排序并等待它们完成。之后使用冒泡排序合并这两个数组。你觉得使用这个算法,排序会更快吗?

【问题讨论】:

  • 我现在才想到这个。我今天/明天将尝试在 C# 中实现它,并将尝试自己对其进行基准测试。我很好奇,所以发布了这个问题,如果有人对此有理论上的想法
  • 冒泡排序将是一个缓慢的合并。尝试对小列表进行冒泡排序,然后对它们进行归并排序。
  • @MalcolmMcLean 通过冒泡排序我的意思是假设我有两个排序数组 A [1,2,3,6,8,9,16] 和 B [4,7,10,11,13, 15]从使用插入排序获得,并且都作为线程运行。我将保留两个数组的最小值和最大值,并从最小值的最小值开始直到它适合。然后将循环直到数组中的任何一个被耗尽。
  • 第二阶段称为合并,而不是冒泡排序。它类似于合并排序正在做的事情。也许您可以编辑问题以修复此术语。 《结合插入排序和合并排序》

标签: sorting optimization


【解决方案1】:

不,一般情况下不会更快。例如,想象一下,您的初始数组如下所示:

[9,5,7,6,8,3,2,0,4,1]

将两半排序后如下所示:

[5,6,7,8,9,0,1,2,3,4]

使用冒泡排序对其进行排序不会比使用冒泡排序对初始数组进行排序快得多。插入排序加上冒泡排序所花费的总时间几乎肯定会比您仅使用单个线程对初始数组进行排序要多。

冒泡排序和插入排序都不适合并行化。你最好实现并行快速排序。或者,如果您坚持在线程中使用插入排序,请使用合并来组合已排序的子数组。当然,合并需要 O(n) 额外的内存。

【讨论】:

  • 是的,你是对的。所以现在如果我做这样的事情,A=[5,6,7,8,9], B= [0,1,2,3,4],我会保留 Amin 和 Bmin。比较它们,并检查哪个具有更大的价值。然后我可以遍历前一个数组(具有较低的最小值)并与后一个数组进行比较,并继续推动它适合的值,直到数组中的任何一个被耗尽
【解决方案2】:

没有。您的方法不会比并行排序算法的已知 方法更快。插入排序是O(n^2),如果应用不会产生更好的结果,除非代码更加并行。假设我假设您只有 two 线程要优化:最好将 Merge sort 与两个线程一起使用,这将有助于在最坏的情况下成为 O(nlogn)。我不知道你为什么要学习两个线程并行,但是从以下资源中学习可能会让你掌握多线程中排序的并行算法的诀窍:
http://www.dcc.fc.up.pt/~fds/aulas/PPD/1112/sorting.pdf

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 2021-09-27
    • 2021-11-03
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多