• 排序算法之直接插入排序


    直接插入排序:顺序的将待排序的数据对象按其值得大小插入到已排序数据元素的有序序列的适当位置。有序序列的数据元素从只有一个数据元素之间增加到所有的素具元素,排序结束。分为倒序比较和正序比较,以下是顺序比较的例子:

    //直接插入排序
    
    const NumberArr = [1, 2, 3, 6, 3, 2, 88, 32, 76, 23, 2, 1];
    
    /**
     * 升幂,倒序比较
     * @param {*} arr 
     */
    function insert_sort_asc(arr) {
        let temp = 0;
        for (let i = 1; i < arr.length; i++) {
            temp = arr[i];
            let j;
            for (j = i; j > 0 && temp < arr[j - 1]; j--) {
                arr[j] = arr[j - 1]; //将大的往有序序列后挪
            }
            arr[j] = temp; //插入到合适位置
        }
        return arr;
    }
    
    /**
     * 降幂 倒序比较
     * @param {*} arr 
     */
    function insert_sort_desc(arr) {
        let temp = 0;
        for (let i = 1; i < arr.length; i++) {
            temp = arr[i];
            let j;
            for (j = i; j > 0 && temp > arr[j - 1]; j--) {
                arr[j] = arr[j - 1]; //将小的往有序序列后挪
            }
            arr[j] = temp; //插入到合适位置
        }
    
        return arr;
    }
    
    /**
     * 正序比较需要挪动太多的元素
     */
    
    console.log(insert_sort_desc(NumberArr));

    算法简洁,但是只有待排序元素个数n较少时,效率才高。

    所需空间:一个表示当前元素的哨兵nTemp。

    所需时间:主要与所需关键字的比较次数和移动的次数有关。

    最坏情况——逆序:总的比较次数为n(n-1)/2,记录的移动次数也为n(n-1)/2,时间复杂度O(n^2)。

    最好情况——正序:比较次数为n-1,记录移动次数为0,时间咋读O(n)。

    由此可推算出直接插入排序算法的平均时间为O(n^2)。

  • 相关阅读:
    [BJOI2019] 光线
    [BJOI2019]奥术神杖
    [HNOI2014]江南乐
    [SDOI2018]荣誉称号
    [APIO2015]雅加达的摩天楼
    [TJOI2015]线性代数
    【CF163E 】e-Government
    【CF917D】Stranger Trees
    网络流(四)dinic算法
    网络流(三)最大流最小割定理
  • 原文地址:https://www.cnblogs.com/huanqiuxuexiji/p/9164572.html
Copyright © 2020-2023  润新知