博客
关于我
OJ.对链表进行插入排序
阅读量:624 次
发布时间:2019-03-13

本文共 1728 字,大约阅读时间需要 5 分钟。

链表中的插入排序插入排序是一种常用的排序算法,特别适用于线性数据结构的排序。如果你对插入排序的逻辑有疑问,不妨接下来仔细了解一下代码实现,从而更好地理解这一算法的原理。

以下是链表插入排序的实现代码:

typedef struct ListNode {    int val;    struct ListNode* next;};struct ListNode* insertionSortList(struct ListNode* head) {    if (head == NULL || head->next == NULL) {        return head;    }    struct ListNode* sorthead = head;    struct ListNode* cur = head->next;    sorthead->next = NULL;    while (cur) {        struct ListNode* post = cur->next;        if (cur->val <= sorthead->val) {            cur->next = sorthead;            sorthead = cur;        } else {            struct ListNode* sortPrev = sorthead;            struct ListNode* sortNext = sortPrev->next;            while (sortNext) {                if (sortNext->val >= cur->val) {                    sortPrev->next = cur;                    cur->next = sortNext;                    break;                } else {                    sortPrev = sortNext;                    sortNext = sortNext->next;                }            }            if (sortNext == NULL) {                sortPrev->next = cur;                cur->next = NULL;            }        }        cur = post;    }    return sorthead;}

代码实现步骤详解:

代码从头节点开始,依次处理链表中的每个节点。初始时,sorthead 指向链表的第一个节点,cur 则从第二个节点开始遍历。通过 while 循环,逐个处理每个节点的插入逻辑。

当当前节点 cur 的值小于或等于 sorthead 的值时,说明 cur 应该插入到 sorthead 之前。我们将 cur 插入到 sorthead 的前面,并更新 sortheadcur

如果 cur 的值大于 sorthead 的值,我们进入后续逻辑。在 sortPrevsortNext 两个指针之间寻找插入位置。我们不断向后移动 sortPrevsortNext,直到找到合适的位置插入 cur节点。

如果在遍历过程中没有找到合适的位置(即 sortNext 遍历到终止),说明当前节点是链表最大的值,需要尾插。将其插入到 sortPrev 的后面。

这种方法的时间复杂度是 O(n^2),因为在最坏的情况下需要对每个节点进行多次比较操作。尽管如此,这种算法的实现相对简单,而且对于小规模数据集来说是非常高效的。

通过这种方式,我们可以清晰地看到插入排序的逻辑,理解其原理和实现细节。这一算法的关键在于合理地将未排序的节点依次插入到已排序链表的适当位置,以逐渐形成一个有序链表。

转载地址:http://wmzaz.baihongyu.com/

你可能感兴趣的文章
OSChina 周四乱弹 ——程序员为啥要买苹果手机啊?
查看>>
OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
查看>>
Osgi环境配置
查看>>
OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
查看>>
OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
查看>>
OSG学习:几何对象的绘制(二)——简易房屋
查看>>
OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
查看>>
OSG学习:场景图形管理(一)——视图与相机
查看>>
OSG学习:场景图形管理(三)——多视图相机渲染
查看>>
OSG学习:场景图形管理(二)——单窗口多相机渲染
查看>>
OSG学习:场景图形管理(四)——多视图多窗口渲染
查看>>
OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
查看>>
Sql 随机更新一条数据返回更新数据的ID编号
查看>>
OSG学习:空间变换节点和开关节点示例
查看>>
OSG学习:纹理映射(一)——多重纹理映射
查看>>
OSG学习:纹理映射(七)——聚光灯
查看>>
OSG学习:纹理映射(三)——立方图纹理映射
查看>>
OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
查看>>
OSG学习:纹理映射(五)——计算纹理坐标
查看>>
OSG学习:纹理映射(六)——灯光
查看>>