链接列表的合并排序
什么是合并排序?
合并排序是一种著名的、最优化的排序算法,其工作原理是分而治之。它也被称为分而治之算法,时间复杂度为O(n*logn)。
它是如何工作的?
合并排序的工作原理有两个简单的步骤。
- 将输入列表分成两个子列表,每个子列表的大小相同。
- 将两个子列表合并成一个大列表,列表中的每个元素都被排序。
现在,数组的合并排序工作可以很容易理解,对于那些对数组的 合并排序工作没有任何概念的人,可以参考这个链接
合并排序的图示
现在,我们来看看链表的合并排序是如何工作的,我们首先来看看链表的合并排序的简单方法
方法。
Step1: Call divideList() and find the mid node of the given linked list and also divide the list into two halves
Step2: Recursively call sortMerge() on both left and right sub-linked list and store the new head of the left and right linked list.
Step3: Call finalMerge() given the arguments new heads of left and right sub-linked lists and store the final head returned after merging.
Step4: Return the final head of the sorted linked list.
在上面的段落中,我们已经讨论了合并排序 的工作原理,所以在这里我们也以类似的方式首先将链表分成两个子列表,然后对这两个子列表进行递归排序,最后合并这两个子列表并返回最终的列表。
讨论一下这个算法,它看起来是这样的。
算法。
如上所述,在第一步中,你必须将列表分成两个子列表,如下面的算法所解释。
start fundtion divideList(headList){
return slowPointer
end divideList
上述将一个链接列表分成两半的算法被称为 "合并排序"。 龟兔赛跑算法
现在,在将列表分为两个子列表后,我们将根据实际的合并排序 算法对这两个子列表进行排序,如下图所示。
start function finalMerge(firstListHead, secondListHead)
start while(firstListHead is not NULL && secondListHead is not NULL){
next of secondHalf = secondListHead
/* If first list is not over */
return next of firstHalf
end sortMerge
现在,在对列表进行排序后,我们将不得不最终获得完整排序后的列表的头部引用,这个函数也将帮助我们使用divideList() 函数获得列表的 前半部分和后半部分的引用。该算法 看起来像这样。
start function sortMerge(headList){
end sortMerge
现在,最终,这解释了关于链接列表的合并排序 如何工作的完整算法,以及列表如何通过划分和征服 的方法进行排序。
现在,由于你已经知道了这个问题背后的算法 ,所以,你现在可以用你想要的编程语言编写你自己的函数式代码 。
分析一下。
- 时间复杂度。O(nlogn),其中n是链表中的节点数。
- 空间复杂度。O(logn),其中n是链表中的节点数。由于我们要把列表分成两个子列表,所以我们给定的最终空间复杂度为O(logn)
继续学习,继续成长,也继续探索更多!
万事如意!
想了解更多有趣和有价值的文章和技巧,请关注我的网站 媒介 和 链接
了解关联列表合并排序背后的算法》最初发表于Medium上的Javarevisited,人们在这里通过强调和回应这个故事来继续对话。