当前位置:网站首页 > 区块链基础 > 正文

单向链表 快速排序(单向链表归并排序)



本节主要阐述自顶向下与自底向上的归并排序,以及改变连接状态与改变节点值的可快速排序。下面来仔细阐述。

归并排序是最适合单链表排序的算法,因为两个链表的归并比较简单,和数组的归并过程思路相同。

bottom-to-up 的归并思路:先两个两个的 merge,完成一趟后,再 4 个4个的 merge,直到结束。

例如:[4,3,1,7,8,9,2,11,5,6].

step=1: (3->4)->(1->7)->(8->9)->(2->11)->(5->6)step=2: (1->3->4->7)->(2->8->9->11)->(5->6)step=4: (1->2->3->4->7->8->9->11)->5->6step=8: (1->2->3->4->5->6->7->8->9->11)

首先编写两个链表的合并程序:

非递归实现

递归实现

对于链表的归并合并与数组归并合并区别,我们会发现链表不能像数组那样根据index去快速索引到相应位置上的值,那么在对链表进行归并排序的时候,就需要确定那两个列表进行归并,然后调用上述merge进行合并即可。

对于一个链表如下:假设sort1为合并列表1的head,sort2为合并列表2的head,那么我们关键就是找出每次合并的这个head即可。

因此这里写出一个获取head的函数:其中head为当前传进来的链表头结点,sz为几路归并。

最后,来编写一下自底向上的归并排序函数:

自顶向下的归并排序需要注意的是:如何找到链表的中点?

通过2个快慢指针,快指针每一步走2个节点,慢指针每一步走1个节点,当快指针到达链表尾部时,慢指针到达链表的中间节点。

改变链接的指向思路:

对一段链表执行划分过程时,头节点可能发生改变以及终止节点可能是非空的,因此对一段链表的划分过程需要给出:前驱节点

改变值的快速排序思想:由于链表只能顺序索引,故不能使用数组划分的方法。将比枢椎小的节点的值,依次和枢椎后的节点的值交换。如 5->3->6->4->7->2 则 5 为枢椎3 < 5: swap(3, 3) ,(起始交换位置为基元的下一个节点,即第2个节点) 6 > 5: continue; 4 < 5: swap(6, 4) (交换位置后移,交换4和第3个节点的值) 7 > 5: continue 2 < 5: swap(4, 2) (交换位置后移,交换2和第4个节点的值)

循环结束 swap(5, 2) (交换枢椎值和第4个节点的值)。

到此这篇单向链表 快速排序(单向链表归并排序)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 腾讯文档 链接(腾讯文档链接怎么生成)2026-03-28 10:54:07
  • 单向链表在内存中是连续存储的(单向链表在内存中是连续存储的什么)2026-03-28 10:54:07
  • 在新标签页中打开链接(在新标签页中打开链接不能用)2026-03-28 10:54:07
  • b站视频怎么弄成链接(b站视频怎么转换成链接)2026-03-28 10:54:07
  • cp1300怎么链接电脑(cp1300如何连接wifi打印)2026-03-28 10:54:07
  • 怎么点击图片进入链接(怎么点击图片进入链接里)2026-03-28 10:54:07
  • 单向链表逆序输出(单向链表的逆转)2026-03-28 10:54:07
  • 对于有头指针和尾指针的单向链表是什么(带头尾指针的单链表)2026-03-28 10:54:07
  • ipv6单播地址前缀(ipv6链路本地单播地址前缀)2026-03-28 10:54:07
  • 单向链表所具备的特点是(单向链表是否有环的最佳方法)2026-03-28 10:54:07
  • 全屏图片