插入排序
插入排序是一种交换排序。核心思想是设定一个有序区,将需要排序的元素依次与有序区域的元素比较交换。插入排序是稳定排序(如果有相同元素排序后元素的位置不变),也是原地排序(不需要额外的空间),平均时间复杂度O(n2),空间复杂度O(1)。
代码实现
初始时默认第一个元素是有序区域,之后每个元素与有序区域比较交换。但是考虑到每次都比较交换实在是有一点浪费,所以可以先不交换,暂时存起来,将比插入元素大的值复制到指定位置,最后在插入位置插入元素。
function insertSort(array) {
// 默认第一个元素是有序区域,所以无序区域从第二个元素开始遍历
for (let i = 1; i < array.length; i++) {
// 插入的值 暂时存起来
const insertValue = array[i];
// 有序区域是i的前面
let j = i - 1;
for (; j >= 0 && insertValue < array[j]; j--) {
// 如果插入值比其他值都小则进行复制
array[j + 1] = array[j];
}
// 在合适位置插入
array[j + 1] = insertValue;
}
}
const array = [12, 1, 3, 46, 5, 0, -3, 12, 35, 16];
insertSort(array);
console.log(array);