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 无提示关闭窗口脚本
Aug 17 Javascript
讲解JavaScript中for...in语句的使用方法
Jun 03 Javascript
Bootstrap入门书籍之(一)排版
Feb 17 Javascript
jQuery 限制输入字符串长度
Jun 20 Javascript
jQuery Ajax 加载数据时异步显示加载动画
Aug 01 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
Sep 19 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
Sep 20 Javascript
详解微信小程序 页面跳转 传递参数
Dec 08 Javascript
关于使用axios的一些心得技巧分享
Jul 02 Javascript
layui 弹出层回调获取弹出层数据的例子
Sep 02 Javascript
nuxt.js写项目时增加错误提示页面操作
Nov 05 Javascript
微信小程序反编译的实现
Dec 10 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上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
详解php中的implements 使用
2017/06/13 PHP
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
JavaScript原型对象原理与应用分析
2018/12/27 Javascript
Vue框架下引入ActiveX控件的问题解决
2019/03/25 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
详解Python中的__new__()方法的使用
2015/04/09 Python
Python import用法以及与from...import的区别
2015/05/28 Python
python write无法写入文件的解决方法
2019/01/23 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
django框架使用方法详解
2019/07/18 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
大学生标准推荐信范文
2013/11/25 职场文书
高中运动会广播稿
2014/01/21 职场文书
公司开业庆典主持词
2014/03/21 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
详解Python中的for循环
2022/04/30 Python