用于合并排序链接列表的 Javascript 程序
合并排序通常是对链表进行排序的首选。链表的缓慢随机访问性能使得其他一些算法(如快速排序)表现不佳,而其他算法(如堆排序)则完全不可能。
设 head 为要排序的链表的第一个节点, headRef 为指向 head 的指针。请注意,我们需要在 MergeSort() 中引用 head,因为下面的实现会更改下一个链接以对链表(不是节点处的数据)进行排序,因此如果原始头部的数据不是链表中的最小值。
MergeSort(headRef)
1) If the head is NULL or there is only one element in the Linked List
then return.
2) Else divide the linked list into two halves.
FrontBackSplit(head, &a, &b); /* a and b are two halves */
3) Sort the two halves a and b.
MergeSort(a);
MergeSort(b);
4) Merge the sorted a and b (using SortedMerge() discussed here)
and update the head pointer using headRef.
*headRef = SortedMerge(a, b);
Javascript
Javascript
输出:
Sorted Linked List is:
2 3 5 10 15 20
时间复杂度: O(n*log n)
空间复杂度: O(n*log n)
方法 2:这种方法更简单,使用 log n 空间。
合并排序():
- 如果链表的大小为 1 则返回头部
- 使用龟兔赛跑方法找到中间点
- 将 mid 的下一个存储在 head2 中,即右子链表。
- 现在使下一个中点为空。
- 递归调用左右子链表的mergeSort(),存储左右链表的新头。
- 给定左右子链表的新头参数,调用merge(),并存储合并后返回的最终头。
- 返回合并链表的最终头。
合并(头1,头2):
- 取一个指针,说合并以将合并列表存储在其中并在其中存储一个虚拟节点。
- 取一个指针 temp 并为其分配合并。
- 如果 head1 的数据小于 head2 的数据,则将 head1 存储在 temp 的 next 中并将 head1 移动到 head1 的 next 中。
- 否则将 head2 存储在 temp 的下一个并将 head2 移动到 head2 的下一个。
- 将 temp 移到 temp 的下一个。
- 重复步骤 3、4 和 5,直到 head1 不等于 null 并且 head2 不等于 null。
- 现在将第一个或第二个链表的任何剩余节点添加到合并的链表中。
- 返回合并后的下一个(将忽略虚拟并返回最终合并链表的头部)
Javascript
输出:
Sorted Linked List is:
2 3 5 7 10 20
时间复杂度:O(n*log n)
空间复杂度: O(log n)
有关详细信息,请参阅有关链接列表的合并排序的完整文章!