JavaScript实现经典排序算法之插入排序


Posted in Javascript onDecember 28, 2016

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。像排序一手扑克牌,开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。

1)算法原理

      插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

2)算法描述和实现

     一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

    <1> 从第一个元素开始,该元素可以认为已经被排序;

    <2> 取出下一个元素,在已经排序的元素序列中从后向前扫描;

    <3> 如果该元素(已排序)大于新元素,将该元素移到下一位置;

    <4> 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

    <5> 将新元素插入到该位置后;

    <6> 重复步骤2~5。

3)JavaScript代码实现

function insertSort(arr) { 
    for (var i = 1; i < arr.length; i++) { 
      var temp = arr[i]; 
      var j = i - 1; 
      while (j >= 0 && arr[j] > temp) { 
        arr[j + 1] = arr[j]; 
         j--; 
      } 
      arr[j + 1] = temp; 
    } 
    return arr; 
 } 
var arr = [1, 45, 37, 5, 48, 15, 37, 26, 29, 2, 46, 4, 17, 50, 52]; 
console.log(insertSort(arr));

        改进插入排序: 查找插入位置时使用二分查找的方式。

步骤:
        <1> 从第一个元素开始,该元素可以认为已经被排序;
        <2> 取出下一个元素,在已经排序的元素序列中二分查找到第一个比它大的数的位置;
        <3> 将新元素插入到该位置后;

function binaryInsertionSort(arr) { 
   for (var i = 1; i < arr.length; i++) { 
     var key = arr[i],left = 0,right = i - 1; 
     while (left <= right) { 
        var middle = parseInt((left + right) / 2); 
        if (key < arr[middle]) { 
          right = middle - 1; 
        } else { 
          left = middle + 1; 
        } 
     } 
     for (var j = i - 1; j >= left; j--) { 
        arr[j + 1] = arr[j]; 
     } 
     arr[left] = key; 
    } 
    return arr; 
} 
var arr = [1, 45, 37, 5, 48, 15, 37, 26, 29, 2, 46, 4, 17, 50, 52]; 
console.log(binaryInsertionSort(arr));

4)算法分析

      最佳情况:输入数组按升序排列。T(n) = O(n)
      最坏情况:输入数组按降序排列。T(n) = O(n2)
      平均情况:T(n) = O(n2)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript获取某年某月的最后一天附截图
Jun 23 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
Nov 26 Javascript
jQuery插件实现大图全屏图片相册
Mar 14 Javascript
jQuery检测鼠标左键和右键点击的方法
Mar 17 Javascript
Vue.js实现拖放效果的实例
Sep 30 Javascript
浅谈js原生拖放
Nov 21 Javascript
微信小程序之ES6与事项助手的功能实现
Nov 30 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
Jul 10 Javascript
Vue源码解读之Component组件注册的实现
Aug 24 Javascript
脚手架vue-cli工程webpack的作用和特点
Sep 29 Javascript
vue多层嵌套路由实例分析
Mar 19 Javascript
Openlayers显示地理位置坐标的方法
Sep 28 Javascript
JavaScript实现经典排序算法之选择排序
Dec 28 #Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
Dec 28 #Javascript
JavaScript实现经典排序算法之冒泡排序
Dec 28 #Javascript
BootStrap Tooltip插件源码解析
Dec 27 #Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
Dec 27 #Javascript
javascript实现文字无缝滚动
Dec 27 #Javascript
JavaScript仿聊天室聊天记录
Dec 27 #Javascript
You might like
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
php扩展开发入门demo示例
2019/09/23 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
Javascript缓存API
2016/06/14 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
JavaScript模块详解
2017/12/18 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
Python二分法搜索算法实例分析
2015/05/11 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
Python创建字典的八种方式
2019/02/27 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
Django密码存储策略分析
2020/01/09 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
一套软件开发工程师笔试题
2015/05/18 面试题
节能减排倡议书
2014/04/15 职场文书
诚信承诺书模板
2014/05/26 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
爱护环境建议书
2015/09/14 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python
MySQL数据管理操作示例讲解
2022/12/24 MySQL