插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:输入: -1->5->3->4->0
输出: -1->0->3->4->5
解题思路:
1、建立一个头结点指向链表头
2、分别设立两个指针指向第一位和第二位节点
3、如果符合排序顺序则两者均向后移动一位
4、如果不符合,则从头和该节点比较将该节点插入;
实现代码:
扫描二维码关注公众号,回复:
10515334 查看本文章
struct ListNode* insertionSortList(struct ListNode* head){
if(head == NULL || head->next == NULL) {
return head;
}
struct ListNode* node = (struct ListNode* ) malloc(sizeof(struct ListNode));
struct ListNode* prev, *cur, *start;
node->next = head;
prev = head;
cur = head->next;
while(cur) {
if(prev->val <= cur->val) {
prev = cur;
cur = cur->next;
}
else {
start = node;
while(start->next && start->next->val <= cur->val)
start = start->next;
prev->next = cur->next;
cur->next = start->next;
start->next = cur;
cur = prev->next;
}
}
head = node->next;
free(node);
return head;
}
运行结果: