|
|
1
88
想知道为什么它应该是一个巨大的挑战,正如这里所说的,这里是一个简单的Java实现,没有任何“聪明的技巧”。
|
|
|
2
19
一个更简单/更清晰的实现可能是递归实现,由此可以更清楚地了解NLog(N)的执行时间。
|
|
|
3
10
主要基于以下优秀代码: http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html 稍微修剪,整理:
|
|
|
4
6
一个有趣的方法是维护一个堆栈,并且只有当堆栈上的列表具有相同数量的元素时才进行合并,否则将推送该列表,直到传入列表中的元素用完,然后向上合并堆栈。 |
|
|
5
2
最简单的是 Gonnet + Baeza Yates Handbook of Algorithms . 你用你想要的排序元素的数量来调用它,递归地将它平分,直到它达到一个大小为1的列表的请求,然后你只需从原始列表的前面剥离。这些都被合并成一个完整的排序列表。 [请注意,第一篇文章中基于cool stack的一个叫做Online Mergesort,在Knuth Vol 3的一个练习中它得到的提及最少] |
|
|
6
2
这是另一个递归版本。这不需要单步执行列表来拆分它:我们提供一个指向head元素的指针(它不是排序的一部分)和一个长度,递归函数返回一个指向已排序列表末尾的指针。
|
|
|
7
2
我一直在为这个算法优化杂波而困扰,下面是我最终得出的结论。互联网上的许多其他代码和StackOverflow是非常糟糕的。有人试图得到列表的中间点,进行递归,对剩余节点有多个循环,维护大量的东西——所有这些都是不必要的。MergeSort自然适合于链表,算法可以是漂亮和紧凑的,但要达到这种状态并不容易。
注意这个答案结合了其他答案的一些技巧 https://stackoverflow.com/a/3032462/207661 . 当代码在C语言中时,将其转换为C++、java等应该是微不足道的。
兴趣点
translated above code to C/C++ 以及对修改意见和更多改进的建议。以上代码现在是最新的这些。 |
|
8
2
我决定在这里测试这些例子,还有一个方法,最初是Jonathan Cunningham在Pop-11中写的。我用C编写了所有的方法,并对一系列不同的列表大小进行了比较。我比较了rajar Harinath的Mono-eglib方法、Shital-Shah的C#代码、Jayadev的Java方法、David Gamble的递归和非递归版本、edwynn的第一个C代码(这与我的示例数据集崩溃了,我没有调试)和Cunningham的版本进行了比较。此处为完整代码: https://gist.github.com/314e572808f29adb0e41.git . Mono-eglib基于与Cunningham相似的思想,并且速度相当,除非列表碰巧已经排序,在这种情况下,Cunningham的方法要快得多(如果部分排序,eglib稍微快一点)。eglib代码使用一个固定的表来保存merge sort递归,而Cunningham的方法是通过使用不断增加的递归级别来工作的,因此它一开始不使用递归,然后使用1-deep递归,然后使用2-deep递归,依此类推,这取决于执行排序所需的步骤数。我发现Cunningham代码更容易理解,而且不需要猜测递归表的大小,所以我对它投了赞成票。我在这个页面上尝试过的其他方法要慢两倍或更多。 以下是Pop-11的C端口:
|
|
|
9
1
这是我对Knuth的“列表合并排序”的实现(算法5.2.4L,摘自TAOCP第3卷,第2版)。我将在结尾处添加一些评论,但下面是一个总结: 在随机输入上,它比Simon Tatham的代码运行得快一点(见Dave Gamble的非递归答案,带有链接),但比Dave Gamble的递归代码运行得慢一点。这比这两者都难理解。至少在我的实现中,它要求每个元素有两个指向元素的指针。(另一种选择是一个指针和一个布尔标志)所以,这可能不是一个有用的方法。但是,有一点很特别,如果输入的数据段很长,并且已经排序,那么它的运行速度非常快。
|
|
|
10
1
这里有一个非递归链表mergesort mono eglib . 其基本思想是各种合并的控制循环与二进制整数的按位递增并行。有 O(n) 合并到“插入” n 合并树中的节点,这些合并的秩对应于递增的二进制数字。用这个比喻,只有 O(对数n) 合并树的节点需要具体化为一个临时保持数组。 |
|
11
1
单链接列表.h:
主.cpp:
|
|
12
1
链表的非递归合并排序的另一个示例,其中函数不是类的一部分。此示例代码和HP/Microsoft
Visual Studio 2015已更改
`std::list<>::sort()` - why the sudden switch to top-down strategy? |
|
|
13
0
这段代码展示了如何用java创建linklist并使用Merge sort对其进行排序。我在MergeNode类中创建节点,还有另一个类MergesortLinklist,其中有拆分和合并逻辑。
|
|
|
14
0
我没有看到任何C++解决方案在这里发布。所以,就这样。希望它能帮助别人。
|
|
|
15
0
以下是链表合并排序的Java实现:
|
|
|
16
0
|
|
|
17
0
嘿,我知道这个答案有点晚了,但是得到了一个简单的答案。 代码是F#的,但可以用任何语言。由于这是ML家族的一种不常见的语言,我将给出一些增强可读性的要点。
需要注意的是,这是完全尾部递归的,因此不存在堆栈溢出的可能性,并且通过先将列表一次性扩展为单例列表,我们可以降低最坏成本的常数因子。因为merge是在list-of-list上工作的,所以我们可以递归地合并和排序内部列表,直到到达一个固定点,所有的内部列表都被排序到一个列表中,然后返回该列表,从而再次从列表列表折叠到列表。 |
|
|
18
0
下面是使用 Swift程序设计语言 .
这是 节点类 &安培; getMiddle方法
|
|
|
19
-4
|
|
|
Rewind · 同时搜索最大值/最小值的操作顺序 1 年前 |
|
|
badbee · 使用xsl:sort时保留未排序元素的问题 1 年前 |
|
|
josepmaria · Pandas顺序列,按对列出 1 年前 |
|
|
BTBts · Python3文件名的字母数字排序[重复] 1 年前 |
|
|
Paul-ET · 对树状图应用程序发送的第一列进行排序失败 1 年前 |
|
VonDerHase · 从列表中删除特定值,Python 1 年前 |
|
|
Nico44044 · JS对数组进行排序,数组末尾为null和空值 1 年前 |