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

单向链表 排序(单链表实现排序)



快排不适合同于链表,但是可以实现,时间复杂度为o(nlgn)

平均时间复杂度O(nlogn),不考虑递归栈空间的话空间复杂度是O(1))

分析:由于单链表是没有prev指针的,所以跟数组一样的low,high指针就不适合单链表

方法一:移动元素节点本身,只移动元素的值 //注意必须以第一个元素为基准中枢值,

1)定义两个指针pslow,pfast,其中pslow指向单链表的头结点,pfast指向单链表头结点的下一个结点;

2)pslow代表的是比基准节点值小的链表的尾节点,此链表的所有的节点,都比基准的值小,pslow是尾节点

3)pslow之后的节点都是比基准节点值大的节点

4)用pfast用于遍历单链表,如果发现此时pfast节点的值pfast->value < pivot,则要把pslow=pslow->next,这就此时的pslow就是大于基准节点的节点了,swap(pslow,pfast),这样小于基准节点的节点,就在pslow中,由于原理pslow的值是大于基准节点值的,所以被swap之后,还是大于基准节点

5)如此遍历,知道pfast到达pend

6)此时,除了基准节点在第一个位置之外,后面的就是按小于基准节点,大于基准节点的两大部分,可以通过swap[pviot,pslow],让基准节点回到中间位置

qucik_sort(head,head,NULL);

你可能回诧异,怎么会是快排?快排不是需要一个指针指向头,一个指针指向尾,然后两个指针相向运动并按一定规律交换值,最后找到一个支点使得支点左边小于支点,支点右边大于支点吗(这句话很长,累死俺了)?是滴,木有错,不过问题出来了。如果是这样的话,对于单链表我们没有前驱指针,怎么能使得后面的那个指针往前移动呢?所以这种快排思路行不通滴,如果我们能使两个指针都往next方向移动并且能找到支点那就好了。怎么做呢?

接下来我们使用快排的另一种思路来解答。我们只需要两个指针pslow和pfast,这两个指针均往next方向移动,移动的过程中保持(pivot,pslow]之前的key都小于选定的key,(pslow,pfast]之间的key都大于选定的key,那么当pfast走到末尾的时候便完成了一次支点的寻找。当所指元素比枢轴小时,将Slow往前游一格,交换Slow和Fast所指元素的值,这样仍能保证Slow指向的元素是小于基准中的最后一个元素。

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

版权声明


相关文章:

  • 跳转链接怎么制作ppt(ppt如何做跳转链接)2025-12-06 14:18:11
  • 头指针为head的带头结点的单向循环链表(头指针为h的循环单链表中尾结点r的特点)2025-12-06 14:18:11
  • b站如何在视频中加链接(b站怎么视频链接)2025-12-06 14:18:11
  • 单双向链表原理(单向链表和双向链表适用什么场合)2025-12-06 14:18:11
  • 如何点击图片跳转链接(点击图片跳转链接软件叫什么)2025-12-06 14:18:11
  • 腾讯文档怎么变成链接(腾讯文档如何做成链接)2025-12-06 14:18:11
  • 单向链表归并排序(单向链表归并排序方法)2025-12-06 14:18:11
  • cp1200链接电脑(cp1300怎么链接电脑)2025-12-06 14:18:11
  • 单向链表所具备的特点是(单向链表所具备的特点是什么)2025-12-06 14:18:11
  • 对于一个设有头指针和尾指针的单链表(对于一个设有头指针和尾指针的单链表结构)2025-12-06 14:18:11
  • 全屏图片