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

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

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

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

等等...

这些都是用空间换取时间

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

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

链表排序(空间复杂度为O(1)算法)_第1张图片

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

链表排序(空间复杂度为O(1)算法)_第2张图片

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

链表排序(空间复杂度为O(1)算法)_第3张图片

交换后未移动

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

链表排序(空间复杂度为O(1)算法)_第4张图片

未交换得移动

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

然后找出次小数据

使hp移动到下一个节点

链表排序(空间复杂度为O(1)算法)_第5张图片

hp=hp->next;

将hp中保存得地址赋给cur

链表排序(空间复杂度为O(1)算法)_第6张图片

cur=hp;

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

链表排序(空间复杂度为O(1)算法)_第7张图片

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

链表排序(空间复杂度为O(1)算法)_第8张图片

空间复杂度为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;
    }
}

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

你可能感兴趣的:(链表,数据结构)