插入排序

一、原理

       ☆思想:和打牌起牌过程类似,第一张牌拿在手里,起第二张牌,和第一张比较,放到它的左右,第三张牌,和前两张比较,放到它们中间或左右,以此类推,手里的牌一直是有序的;每次一张新牌,和现有牌比较,插入合适位置,直到拿到所有牌,最终得到有序序列;

       ☆过程:以递增为例,用数组表示,长度为n,整个数组为无序集合;首元素自然有序,不处理;从第二个元素开始循环,记录其元素值为基准值,依次和其前元素循环比较,如果小于则该元素后移一位,直到找到一个不小于基准值的元素,把基准值放到其后;

二、实现代码

      JavaScript 代码实现

function InsertSort(arr) {
    var curr, preIndex;
    for (var i = 1; i < arr.length; i++) {
        //新插入元素i暂存
        curr = arr[i];
        //循环其前元素
        preIndex = i - 1;
        while (curr < arr[preIndex] && preIndex >= 0) {
            //比新元素大的元素后移
            arr[preIndex + 1] = arr[preIndex];
            preIndex--;
        }
        //插入到最后一个移动元素的位置
        arr[preIndex + 1] = curr;
        console.log(i + ':' + arr);
    }
}

 

三、优化

      无;

四、复杂度

名称 时间复杂度 空间复杂度  稳定性 
平均 最坏 最优
插入排序 O(n²) O(n²) O(n)  O(1)

      最差情况,数组反序,首元素不需要处理,第二个元素,需要1次比较,…最后一个元素,需要进行n-1次比较,共需要1+2+3+……+(n-1)=n(n-1)/2次比较;

      最优情况,数组正序,首元素不需要处理,第二个元素,需要1次比较,…最后一个元素,需要进行1次比较,共需要1+1+1+……+1=n-1次比较;

      本排序需要申请一个额外空间;

      使用数组表示,相同元素顺序不变化,本排序稳定。

posted @ 2019-11-23 16:19  老余的水壶  阅读(122)  评论(0)    收藏  举报