1. 插入排序基本原理
将一个无序序列,分成两部分,一部分是已排序序列,另一部分是未排序序列。
然后将未排序序列第一个元素看作是待排序序列,把未排序序列第二个元素到最后一个元素当成是未排序序列。把待排序序列从头依次扫描已排序序列元素,直到找到比自身小的元素,然后插入在比自身小的元素后面。
2. 动图演示
假设对n个元素进行插入排序,则需要进行n-1趟排序。
3.伪代码
for i ← 0 to n
> key ← num[i]
> j ← i – 1
>
> while j >= 0 && num[j] > key do
> num[j + 1] ← num[j]
> j--
> end
>
> num[j + 1] ← key;
> end
输入:有n个元素的乱序数组num
输出:有序的数组num
4. JavaScript实现
window.onload = function()
{
var num = new Array(4, 51, 23, 32, 42, 65, 12, 6, 26);
var key, i, j;
//i元素之前的元素都是已排序序列,i是待排序序列
for(i = 0; i < num.length; i++){
key = num[i]; //拿出待排序序列
j = i - 1;
//和已排序序列对比
while(j >=0 && num[j] > key){
//把以排序序列向后移动一位
num[j + 1] = num[j];
j--;
}
//当已排序序列比待排序序列小
//插入在后面
num[j + 1] = key;
}
num.forEach(i => { //输出数组
console.log(i);
});
}
5.时间复杂度
该算法基本运算规则:j >=0 && num[j] > key
最好时间复杂度
当输入数组是顺序有序的(1,2,3,4……),for执行n次,内嵌循环while则一次都不执行。这种情况下时间复杂度也就是o(n)
最坏时间复杂度
当输入的数组是以逆序有序的(10,9,8……),在这种情况下,每一次最外层的for执行一次,内层while循环要一直执行到j = 0,也就是(j←I – 1)一直减1,到0才停止执行,执行了 I – 1次。也就是在逆序情况下,内嵌循环要把每一种结果对比一遍。时间复杂度也就是o(n²)