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下的keyCode键码值表
Apr 10 Javascript
jQuery中live方法的重复绑定说明
Oct 21 Javascript
文字不间断滚动(上下左右)实例代码
Apr 21 Javascript
jQuery Ajax使用实例
Apr 16 Javascript
javascript去除空格方法小结
May 21 Javascript
利用js编写响应式侧边栏
Sep 17 Javascript
bootstarp modal框居中显示的实现代码
Feb 18 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
Mar 07 Javascript
ES6中字符串string常用的新增方法小结
Nov 07 Javascript
微信小程序自定义prompt组件步骤详解
Jun 12 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 Javascript
JavaScript十大取整方法实例教程
Dec 03 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
JAVA/JSP学习系列之七
2006/10/09 PHP
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
JS解析XML实例分析
2015/01/30 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
js实现轮播图的完整代码
2020/10/26 Javascript
浅析vue-router原理
2018/10/19 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
Python中获取网页状态码的两个方法
2014/11/03 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
详解Python中的type和object
2018/08/15 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
解析Python3中的Import
2019/10/13 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
介绍一下linux的文件权限
2012/02/15 面试题
介绍一下linux的文件系统
2015/10/06 面试题
《猴子种树》教学反思
2014/02/14 职场文书
校园安全演讲稿
2014/05/09 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python