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 相关文章推荐
WEB高性能开发之疯狂的HTML压缩
Jun 19 Javascript
JS 自定义带默认值的函数
Jul 21 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
Jan 24 Javascript
关于js注册事件的常用方法
Apr 03 Javascript
判断iframe里的页面是否加载完成
Jun 06 Javascript
Js调用Java方法并互相传参的简单实例
Aug 11 Javascript
vue.js初学入门教程(2)
Nov 07 Javascript
ReactNative页面跳转Navigator实现的示例代码
Aug 02 Javascript
关于JavaScript的单双引号嵌套问题
Aug 20 Javascript
微信小程序自定义tab实现多层tab嵌套功能
Jun 15 Javascript
layui点击按钮添加可编辑的一行方法
Aug 15 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
Sep 30 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
PHP常用代码
2006/11/23 PHP
php代码把全角数字转为半角数字
2007/12/10 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
JavaScript游戏之优化篇
2010/11/08 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
vue-cli开发环境实现跨域请求的方法
2018/04/07 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
django 发送手机验证码的示例代码
2018/04/25 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
Python面向对象之Web静态服务器
2019/09/03 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
Html5获取高德地图定位天气的方法
2019/12/26 HTML / CSS
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
最受欢迎的自我评价
2013/12/22 职场文书
优秀纪检干部材料
2014/08/27 职场文书
python某漫画app逆向
2021/03/31 Python
Python 数据结构之十大经典排序算法一文通关
2021/10/16 Python
为Centos安装指定版本的Docker
2022/04/01 Servers
Python测试框架pytest高阶用法全面详解
2022/06/01 Python