20201120
20201120
插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。
示例:
输入: 4->2->1->3
输出: 1->2->3->4
输入: 4->2->1->3
输出: 1->2->3->4
链表只能从前到后遍历节点,那么涉及到本题中排序的逻辑最直观的就是多次遍历链表:
注意:
抛砖引玉
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var insertionSortList = function(head) {
if (head === null) return head
let _result = new ListNode(0),
index = head, // 排序片段指针
node = head.next // 遍历指针
_result.next = head
while (node) {
// 遇到未排序节点(当前node为非排序节点)
if (node.val < index.val) {
const next = node
// 将node拆除
index.next = node.next
// 从头遍历链表找插入位置
let i = _result
while (i.next) {
if (i.next.val > node.val) {
// 插入节点node节点
node.next = i.next
i.next = node
break
}
i = i.next
}
} else {
// 更新排序片段指针
index = index.next
}
// 更新遍历的起点
node = index.next
}
return _result.next
}
博客: 前端小书童
每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目 欢迎关注留言
公众号:前端小书童