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 禁止复制网页
Jun 11 Javascript
input 输入框内的输入事件详细分析
Mar 17 Javascript
jquery validate使用攻略 第四步
Jul 01 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
Feb 10 Javascript
初步了解javascript面向对象
Nov 09 Javascript
高效的jquery数字滚动特效
Dec 17 Javascript
使用vue制作探探滑动堆叠组件的实例代码
Mar 07 Javascript
JS遍历DOM文档树的方法实例详解
Apr 03 Javascript
Vue常用的几个指令附完整案例
Nov 06 Javascript
VsCode与Node.js知识点详解
Sep 05 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
Oct 17 Javascript
微信小程序实现通讯录列表展开收起
Nov 18 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变量作用域的一些问题
2013/08/08 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
解析jquery获取父窗口的元素
2013/06/26 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
python调用fortran模块
2016/04/08 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
Python中Threading用法详解
2017/12/27 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
电子商务专业推荐信范文
2013/12/02 职场文书
校园之声广播稿
2014/01/31 职场文书
档案信息化建设方案
2014/05/16 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
医生辞职信范文
2015/03/02 职场文书
内勤岗位职责范本
2015/04/13 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书