链表排序(空间复杂度为O(1)算法)

对链表排序有许多种算法,如

1、开辟一个数组保存链表中的值,排序然后再去重组链表,

2、遍历链表,找出最小的值保存,然后删除该值得节点,然后创建新的链表链接上该值

等等...

这些都是用空间换取时间

而今天我将所以新的算法,利用时间换去空间得算法(利用双指针对链表进行排序)

利用双指针对链表进行排序

首先创建指针,将head得中保存的地址赋给两个指针

如果cur节点中得值小于hp得值,就进行交换节点中数据,然后再移动cur到下一节点;

交换后未移动

否则cur只移动,不进行数据交换

未交换得移动

cur从头遍历到NULL为一次循环;

然后找出次小数据

使hp移动到下一个节点

hp=hp->next;

将hp中保存得地址赋给cur

cur=hp;

重复以上步骤,直到hp->next未空指针停止循环操作;

此刻链表中的数据全部排序完毕

空间复杂度为O(1):只创建了排序所利用得2个指针得大小得空间;

时间复杂度为O(N^2):排最小,遍历长度为N ;

排次小,遍历长度N-1

排再次小,遍历长度N-2

.........

最后一次,长度为1

所以N+N-1+N-2+N-3+...+1为N(1+N)/2==>O(N^2);

接口代码

void SListsort(SL**head)
{
    SL* ph = *head;
    while (ph->next)
    {
        SL* cur = ph;
        while (cur)
        {
            if (cur->date < ph->date)
            {
                Swap(&cur->date, &ph->date);
            }
            cur = cur->next;
        }
        ph=ph->next;
    }
}

谢谢大家,图画的很烂,如有不足之处,望大佬指点一二

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云的小站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值