既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
以下原理及实现均为个人理解,如有错误或更优解,欢迎留言指正!
排序算法概述
盗个图
转自:https://www.cnblogs.com/onepixel/articles/7674659.html
排序算法复杂度
由于是链表排序,首先定义链表节点数据结构
common.h
typedef struct Node LNode;
struct Node {
int data;
LNode *next;
LNode *prev;
};
备注:以下排序算法默认由小到大排序
链表排序需要注意保证链表节点直接的连续性
- 直接插入排序
算法简介
- 第一个链表节点,可以认为是已排序好;
- 从第二个节点开始进行排序操作,逐一向前遍历,对比节点值大小,遍历至第一个比它的值小的节点,把待排序节点插入到该节点后面;
- 依次对后续所有节点重复第2步操作,直至操作到最后一个节点。
算法实现
LNode\* insert\_sort(LNode \*p)
{
if(NULL == p) return p;
LNode \*tmp = NULL; //指向待排序节点,用于节点插入
LNode \*q = p, \*t = q->next;// q指向待排序节点的前一个节点,t指向待排序节点
while(t)
{
if(q->data < t->data)
{
tmp = t;
t = t->next;
if(t)
{
t->prev = q;
}
q->next = t;
while(q && (q->data < tmp->data))
{
q = q->prev;
}
if(q)
{
tmp->next = q->next;
q->next->prev = tmp;
q->next = tmp;
tmp->prev = q;
}
else
{
tmp->next = p;
tmp->prev = NULL;
p->prev = tmp;
p = tmp;
}
if(t)
{
q = t->prev;
}
}
else
{
t = t->next;
q = q->next;
}
}
return p;
}
- 归并排序
算法简介
归并排序采用分治思想,首先使其子序列成为有序序列,然后再对子序列进行归并。
递归实现:
- 首先把链表分割为两个子链表(采用快慢指针找到链表中间节点),递归该分割过程,直至子链表只包含一个节点为止;
- 创建一个新的链表节点,指向排序好的链表;对分割得到的两个子链表逐一遍历对比,值小的节点插入到新链表后面;
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新