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 相关文章推荐
js 页面执行时间计算代码
Mar 04 Javascript
锋利的jQuery jQuery中的DOM操作
Mar 21 Javascript
一个简单的js动画效果代码
Jul 20 Javascript
跨浏览器的事件对象介绍
Jun 27 Javascript
自己写的Javascript计算时间差函数
Oct 28 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
Nov 22 Javascript
jQuery实现设置、移除文本框默认值功能
Jan 13 Javascript
JS动态添加iframe的代码
Sep 14 Javascript
jQuery往返城市和日期查询实例讲解
Oct 09 Javascript
jquery easyui validatebox remote的使用详解
Nov 09 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
Feb 15 Javascript
laypage+SpringMVC实现后端分页
Jul 27 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
php生成EXCEL的东东
2006/10/09 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
javascript实现颜色渐变的方法
2013/10/30 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
2013/12/12 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
js实现选项卡效果
2020/03/07 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python读csv文件去掉一列后再写入新的文件实例
2017/12/28 Python
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
python中time库的实例使用方法
2019/10/31 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
Python中如何添加自定义模块
2020/06/09 Python
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
市场开发与营销专业求职信
2013/12/31 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
大班开学家长寄语
2014/04/04 职场文书
《诚实与信任》教学反思
2014/04/10 职场文书
清洁工个人工作总结
2015/03/05 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers