直接插入排序

113 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)

逐个抽取逐个比较,遇到相同元素是否交换取决于我们的判断条件,如果是大于等于(或小于等于)为判断条件,那么相同元素的位置会交换,如果我们的判断条件只是大于(或小于),相同元素就不会交换,这种可以控制相同元素前后顺序的排序方法,我们可以说该算法是稳定的。