@插入排序
首先来解释一下插入排序法的原理:
它的原理是每插入一个数都要将它和之前的已经完成排序的序列进行重新排序,也就是要找到新插入的数对应原序列中的位置。那么也就是说,每次插入一个数都要对原来排序好的那部分序列进行重新的排序,时间复杂度同样为O(n²)。 这种算法是稳定的排序方法。
下面我用一个图来解释一下
首先这是一个未经排序的数组:
我们要做的从a[1]开始,至于为什么不是a[0]。a[0]之前没有与a[0]进行比较的元素。我们插入a[1],这个时候我们需要遍历a[1]和a[1]之前的所有元素进行比较。这个时候我们需要设置一个变量j,用来记录第一个 比 a[1]元素小的那个元素的下标,也就是a[1]要插入的位置,这个时候跳出循环,并且每发现一个比a[1]大的元素,就要令这个元素后移一位。依次类推的算法直到整个数组的最后一个。
以a[4]为例,假设a[3] (注意,这个地方,从a[0]到a[3]已经完成了排序)小于 a[4] ,那么就j的值是 3
那么这个时候 a[4] 就应该放在 下标是3+1 = 4的位置处
先附上代码:
//(ts)
public static insertSort(arr:Array<any>){
let tLen = arr.length;
let val = null;//将要插入的已排好序列的元素
/**第一个元素认为已经是有序的,循环从第二个元素开始,即下标为 1*/
for (let i = 1; i < tLen; i++) {
val = arr[i];//先保存要插入的元素,这个位置可以认为已经空了出来
//遍历已排好的序列
let j = i;
while (j >= 1 && arr[j-1]>val) {//如果前面的元素大于后面的元素
//为将要插入的新元素腾出空间
arr[j] = arr[j-1]; //前面的元素后移
j--;
}
//将新元素插入到已排序序列中
arr[j] = val;
}
}
验证结果:
排序前:
[5,9,3,8,4,1,4,8,6,10,32,12];
排序后:
[1, 3, 4, 4, 5, 6, 8, 8, 9, 10, 12, 32]
好了,这就是插入算法了,缺点就是时间消耗会非常大。