插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insertion-sort-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一个指针指向当前已排序的最后一个位置,这里用的是head指针
另外一个指针pre,每次从表头循环,这里用的是表头指针
每次拿出未排序的节点,先和前驱比较,如果大于或者等于前驱,就不用排序了,直接进入下一次循环。
如果前驱小,则进入内层循环,依次和pre指针比较,插入对应位置即可。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
ListNode* ret = new ListNode;
ret->next = head;
while (head && head->next) {
if (head->val <= head->next->val) {
head = head->next;
continue;
}
ListNode* pre = ret;
while (pre->next) {
if (pre->next->val > head->next->val) {
break;
}
pre = pre->next;
}
ListNode* cur = head->next;
head->next = cur->next;
cur->next = pre->next;
pre->next = cur;
}
return ret->next;
}
};