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 相关文章推荐
嵌入式iframe子页面与父页面js通信的方法
Jan 20 Javascript
js选项卡的实现方法
Feb 09 Javascript
Bootstrap学习笔记之js组件(4)
Jun 12 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
Jul 14 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
Nov 05 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
Dec 08 Javascript
JS中Swiper的使用和轮播图效果
Aug 11 Javascript
webpack组织模块打包Library的原理及实现
Mar 10 Javascript
JavaScript多态与封装实例分析
Jul 27 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
Aug 12 Javascript
使用react render props实现倒计时的示例代码
Dec 06 Javascript
谈谈IntersectionObserver懒加载的具体使用
Oct 15 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 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
ie6 动态缩略图不显示的原因
2009/06/21 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
Python中elasticsearch插入和更新数据的实现方法
2018/04/01 Python
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
老公爱的承诺书
2014/03/31 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS