对链表排序有许多种算法,如
1、开辟一个数组保存链表中的值,排序然后再去重组链表,
2、遍历链表,找出最小的值保存,然后删除该值得节点,然后创建新的链表链接上该值
等等...
这些都是用空间换取时间
而今天我将所以新的算法,利用时间换去空间得算法(利用双指针对链表进行排序)
利用双指针对链表进行排序
![](https://i-blog.csdnimg.cn/blog_migrate/5808f00eb0b22d8adf7f9c97dbdd1e5f.png)
首先创建指针,将head得中保存的地址赋给两个指针
![](https://i-blog.csdnimg.cn/blog_migrate/781bd8d89a6f68568856ac3bb6c78216.png)
如果cur节点中得值小于hp得值,就进行交换节点中数据,然后再移动cur到下一节点;
![](https://i-blog.csdnimg.cn/blog_migrate/61af52be3374c03ee941cd32b698bd6b.png)
交换后未移动
否则cur只移动,不进行数据交换
![](https://i-blog.csdnimg.cn/blog_migrate/3128d2a2705f2f28046beaced6df3aae.png)
未交换得移动
cur从头遍历到NULL为一次循环;
然后找出次小数据
使hp移动到下一个节点
![](https://i-blog.csdnimg.cn/blog_migrate/502a08b34dd7ba959cd0901af9902ced.png)
hp=hp->next;
将hp中保存得地址赋给cur
![](https://i-blog.csdnimg.cn/blog_migrate/c7af754655e70b1982e1ab64c9023723.png)
cur=hp;
重复以上步骤,直到hp->next未空指针停止循环操作;
![](https://i-blog.csdnimg.cn/blog_migrate/764433bd90c4190e453ce7cbc69cac6c.png)
此刻链表中的数据全部排序完毕
![](https://i-blog.csdnimg.cn/blog_migrate/7a4cea9bd8014875f9ba301b0c31f0c8.png)
空间复杂度为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;
}
}
谢谢大家,图画的很烂,如有不足之处,望大佬指点一二