zoukankan      html  css  js  c++  java
  • js 实现排序算法 -- 插入排序(Insertion Sort)

    原文:

      十大经典排序算法(动图演示)

    插入排序

      插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

    算法描述:

    一般来说,插入排序都采用 in-place 在数组上实现:

    • 从第一个元素开始,该元素可以认为已经被排序;
    • 取出下一个元素,在已经排序的元素序列中从后向前扫描;
    • 如果该元素(已排序)大于新元素,将该元素移到下一位置;
    • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
    • 将新元素插入到该位置后;
    • 重复步骤2~5。

    动图演示:

    代码实现:

    function Insertion(arr) {
      let len = arr.length;
      let preIndex, current;
      for (let i = 1; i < len; i++) {
        preIndex = i - 1;
        current = arr[i];
        while (preIndex >= 0 && current < arr[preIndex]) {
          arr[preIndex + 1] = arr[preIndex];
          preIndex--;
        }
        arr[preIndex + 1] = current;
      }
      return arr;
    }
    
    
    var arr = [3,5,7,1,4,56,12,78,25,0,9,8,42,37];
    Insertion(arr);
    

    理一下大体思路:

    1.默认从 i = 1 开始判断,这样 preIndex 自然是内部循环的游标;

    2.current 保存 arr[i],通过循环来确定 current 的最终位置;

    3.每个内循环开始的时候,arr[i] === current === arr[preIndex + 1],所以在内循环首次时 arr[preIndex + 1] = arr[preIndex] 的时候不必担心 arr[i] 的值丢失;

    4.总体思路是,需要排位的元素先额外缓存起来,然后套用内循环,使得需要调整的元素赋值给它后面的一个位置上,形成依次挪位,最后因为内循环在判断条件不生效的时候停止意味着找到了需要排位的元素的正确位置,然后赋值上去,完成排序。

    算法分析:

      插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

  • 相关阅读:
    cygwin补充安装gcc/g++的方法
    JS中获取request的值,非常好用的JS代码
    登录页面跳出框架的JS
    asp.net DataTable转JSON
    ASP.NET文件下载的实用方法
    史上最牛X到的身份证号码验证,测试误差为0
    nopcommerce插件深度剖析
    C# foreach,linq,delegate集合查询的性能比较
    jquery tab插件精简版
    建议博客园成立中国的开源项目组织,同意的顶起
  • 原文地址:https://www.cnblogs.com/cc-freiheit/p/10983395.html
Copyright © 2011-2022 走看看