插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法
原理
把待排序的序列关键key值插入到已排序的序列中,直到所有的都插入完毕。
算法思路
直接插入排序的算法思路:
- (1) 设置监视哨r[0],将待插入记录的值赋值给r[0];
- (2) 设置开始查找的位置j;
- (3) 在数组中进行搜索,搜索中将第j个记录后移,直至r[0].key≥r[j].key为止;
- (4) 将r[0]插入r[j+1]的位置上。
JavaScript 实现
function insertSort(arr,tp){
if(!arr.length) throw error 'please input array '
if(arr.length<2) return arr;
let tmp = r[0];
r[0] = tp;
let len = arr.length;
for (let i = 1; i < arr.length; i++) {
for (let j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
return arr;
}
关键码是数据元素中某个数据项的值,用它可以标示一个数据元素。通常会用记录来标示数据元素,一个记录可以有若干数据项组成。例如,一个学生的信息就是一条记录,它包括学号,姓名,性别等若干数据项。主关键码可以唯一的标示一个记录的关键码,如学号。次关键码是可以标示若干记录的关键字,如性别、姓名。
内部排序和外部排序
根据排序过程中涉及的存储器不同,可以将排序方法分为两大类:一类是内部排序,指的是待排序的几率存放在计算机随机存储器中进行的排序过程;另一类的外部排序,指的是排序中要对外存储器进行访问的排序过程。 内部排序是排序的基础,在内部排序中,根据排序过程中所依据的原则可以将它们分为5类:插入排序、交换排序、选择排序、归并排序和基数排序;根据排序过程的时间复杂度来分,可以分为三类:简单排序、先进排序、基数排序。
分类
包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序。属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) 。