【数据结构学习笔记】选择排序
参考电子书:排序算法精讲
算法原理
插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
js
const nums = [6, 3, 9, 1, 4];
// 从第一个开始,因为 nums[0] 天然有序
for (let i = 1; i < nums.length; i++) {
// 取出当前值
const current = nums[i];
let j = i - 1;
// 找到符合调节的 j
while(j >= 0 && nums[j] > current) {
// 数据后移
nums[j + 1] = nums[j];
// 指针向前移
j--;
}
// 插入当前值
nums[j + 1] = current;
}
相关例题
LC 147.对链表进行插入排序
给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头
js
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var insertionSortList = function(head) {
// 展开链表
const nums = [];
let current = head;
while(current) {
nums.push(current.val);
current = current.next;
}
// 从第一个开始,因为 nums[0] 天然有序
for (let i = 1; i < nums.length; i++) {
// 取出当前值
const current = nums[i];
let j = i - 1;
// 找到符合调节的 j
while(j >= 0 && nums[j] > current) {
// 数据后移
nums[j + 1] = nums[j];
// 指针向前移
j--;
}
// 插入当前值
nums[j + 1] = current;
}
// 拼接链表
const newHead = new ListNode();
let newCurrent = newHead;
for (const num of nums) {
const node = new ListNode(num);
newCurrent.next = node;
newCurrent = newCurrent.next
}
return newHead.next;
};