本文共 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 的前面,并更新 sorthead 为 cur。
如果 cur 的值大于 sorthead 的值,我们进入后续逻辑。在 sortPrev 和 sortNext 两个指针之间寻找插入位置。我们不断向后移动 sortPrev 和 sortNext,直到找到合适的位置插入 cur节点。
如果在遍历过程中没有找到合适的位置(即 sortNext 遍历到终止),说明当前节点是链表最大的值,需要尾插。将其插入到 sortPrev 的后面。
这种方法的时间复杂度是 O(n^2),因为在最坏的情况下需要对每个节点进行多次比较操作。尽管如此,这种算法的实现相对简单,而且对于小规模数据集来说是非常高效的。
通过这种方式,我们可以清晰地看到插入排序的逻辑,理解其原理和实现细节。这一算法的关键在于合理地将未排序的节点依次插入到已排序链表的适当位置,以逐渐形成一个有序链表。
转载地址:http://wmzaz.baihongyu.com/