我在一个论坛上阅读以下内容: 合并sorting对于像链接列表这样的不可变数据结构非常有效 和 当数据存储在内存中时,快速sorting通常比合并sorting更快。 但是,当数据集很大并且存储在外部设备(如硬盘驱动器)上时,合并sorting在速度上是明显的优势。 它最大限度地减less了外部驱动器的昂贵的读取 和 在链表上操作时,合并sorting只需要less量的辅助存储 有人能帮我理解上面的说法吗? 为什么合并sorting首选sorting巨大的链表? 以及如何最大限度地减less昂贵的读取到外部驱动器? 基本上我想明白为什么要select合并sorting一个大的链表。
Java的Arrays.sort方法使用Quicksort处理基元数组,并为对象数组合并sorting。 我相信大部分时间Quicksort比合并sorting更快并且成本更低。 我的实验支持,尽pipe这两种algorithm都是O(n log(n))。 那么为什么不同的algorithm用于不同的types呢?
我怎样才能为Java实现一个并发的quicksort或mergesortalgorithm? 我们在16位(虚拟)核心Mac上遇到问题,其中只有一个核心(!)正在使用默认的Javasortingalgorithm,而且很好地看到非常好的机器被完全没有使用。 所以我们写了我们自己的(我写的),而且确实获得了很好的加速(我写了一个multithreading的快速sorting,由于它的分区性质,它并行化很好,但我也可以写一个mergesort)多达4个线程,它是专有代码,我宁愿使用来自信誉良好的源代码,而不是使用我重新发明的轮子。 我在网上find的唯一一个例子是如何不用 Java编写multithreading的快速sorting,它是繁忙循环(这真的很糟糕)使用: while (helpRequested) { } http://broadcast.oreilly.com/2009/06/may-column-multithreaded-algor.html 所以除了失去一个线程没有理由,它确保通过在while循环(这是mindboggling)忙循环杀死perfs。 因此,我的问题是:你知道任何正确的multithreading的快速sorting或Java中的合并实现将从一个有信誉的来源? 我把重点放在这样一个事实上,即我知道复杂性保持O(n log n),但是我仍然非常乐意看到所有这些内核开始工作,而不是闲置。 请注意,对于其他任务,在同样的16个虚拟内核Mac上,我通过并行化代码(我并不是指并发专家)加速到x7。 所以,即使艰难的复杂性保持O(n日志n),我真的很感激x7或x8甚至x16的加速。