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』限制Input只能输入数字实现思路及代码
Apr 22 Javascript
jquery配合css简单实现返回顶部效果
Sep 30 Javascript
jQuery实现公告文字左右滚动的实例代码
Oct 29 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
Dec 20 Javascript
Jquery搜索父元素操作方法
Feb 10 Javascript
jQuery满屏焦点图左右滚动特效代码分享
Sep 07 Javascript
js中flexible.js实现淘宝弹性布局方案
Jun 23 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
Nov 25 Javascript
vue项目中实现缓存的最佳方案详解
Jul 11 Javascript
vue props对象validator自定义函数实例
Nov 13 Javascript
使用PreloadJS加载图片资源的基础方法详解
Feb 03 Javascript
国内常用的js类库大全(CDN公共库)
Jun 24 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查询操作实现投票功能
2016/05/09 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
在JavaScript中,为什么要尽可能使用局部变量?
2009/04/06 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
使用Python的Scrapy框架十分钟爬取美女图
2016/12/26 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
django的csrf实现过程详解
2019/07/26 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
Python插件机制实现详解
2020/05/04 Python
python线程池如何使用
2020/05/28 Python
python名片管理系统开发
2020/06/18 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
惠普新加坡官方商店:HP Singapore
2020/04/17 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
自荐信格式
2013/12/01 职场文书
军训感想500字
2014/02/20 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
中学生逃课检讨书
2015/02/17 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
合作意向书怎么写
2019/06/24 职场文书
以下牛机,你有几个
2022/04/05 无线电