持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天
直接插入排序
顾名思义,直接插入,简单粗暴,我们从数组的第二个元素开始取,取出后与其前面的数组元素进行逐个比较,找到比它大(或小,具体看要实现递增还是递减)的元素就进行替换,替换到合适位置后,我们就去按顺序继续取第三个第四个元素,再次与前方元素比较,直到将最后一位元素顺利插入为止,我们便完成了排序。
实现
下面是代码实现(JavaScript):
function straightInsertionSort(arr){
//i=1,从第二个元素开始取
for(let i = 1;i < arr.length;i++){
for(let j = i;j >= 0;j--){
//升序排序
if(arr[j] < arr[j-1]){
let temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
}
}
}
}
时空复杂度及稳定性(相同元素排序后的前后顺序是否改变)
最佳情况:数组本身已是正序,在这种情况下,第二层循环每次只需要比较一次即可,需要进行的比较次数是(n-1)次。 最坏情况:数组本身是反序,那么此时需要进行的比较次数是n(n-1)/2次。
平均插入排序算法的时间复杂度为 O(n^2)。
所以,插入排序不适合用于对大量数据的排序。
由于是就地排序,辅助空间为常量,空间复杂度为O(1)
//测试对有近十万个数据的数组进行排序,花费时间如下
test: 1:58.022 (m:ss.mmm)
逐个抽取逐个比较,遇到相同元素是否交换取决于我们的判断条件,如果是大于等于(或小于等于)为判断条件,那么相同元素的位置会交换,如果我们的判断条件只是大于(或小于),相同元素就不会交换,这种可以控制相同元素前后顺序的排序方法,我们可以说该算法是稳定的。