了解关联列表合并排序背后的算法

151 阅读3分钟

链接列表的合并排序

什么是合并排序?

合并排序是一种著名的、最优化的排序算法,其工作原理是分而治之。它也被称为分而治之算法,时间复杂度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,人们在这里通过强调和回应这个故事来继续对话。