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高级程序设计
Dec 29 Javascript
删除javascript中注释语句的正则表达式
Jun 11 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
Jun 15 Javascript
jQuery 删除或是清空某个HTML元素示例
Aug 04 Javascript
jQuery实现tab选项卡效果的方法
Jul 08 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
May 26 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
May 28 Javascript
Angularjs使用指令做表单校验的方法
Mar 31 Javascript
详解react关于事件绑定this的四种方式
Mar 09 Javascript
深入理解JS异步编程-Promise
Jun 03 Javascript
vue如何实现自定义底部菜单栏
Jul 01 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
Jul 26 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
一个域名查询的程序
2006/10/09 PHP
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
2009/04/25 PHP
javascript 面向对象编程基础:继承
2009/08/21 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
收集前端面试题之url、href、src
2018/03/22 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python中正则表达式的详细教程
2015/04/30 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
旧时光糖果:Old Time Candy
2018/02/05 全球购物
Python如何定义一个函数
2015/09/01 面试题
初一地理教学反思
2014/01/16 职场文书
腾讯广告词
2014/03/19 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
2015年科普工作总结
2015/07/23 职场文书
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python
python APScheduler执行定时任务介绍
2022/04/19 Python
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang