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 28 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
Nov 10 Javascript
js每隔5分钟执行一次ajax请求的实现方法
Nov 27 Javascript
JS对象转换为Jquery对象示例
Jan 26 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
Aug 18 Javascript
AngularJS内置指令
Feb 04 Javascript
关于JS变量和作用域详解
Jul 28 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
Jan 04 Javascript
js分页之前端代码实现和请求处理
Aug 04 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
Aug 27 jQuery
基于JavaScript伪随机正态分布代码实例
Nov 07 Javascript
小程序外卖订单界面的示例代码
Dec 30 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从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
AngularJS实现网站换肤实例
2021/02/19 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
亮化工程实施方案
2014/03/17 职场文书
环保标语口号
2014/06/13 职场文书
授权委托书协议书
2014/10/16 职场文书
撤诉书怎么写
2015/05/19 职场文书
机关工会工作总结2015
2015/05/26 职场文书
领导欢送会主持词
2015/07/06 职场文书
关于军训的感想
2015/08/07 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python
Redis实战高并发之扣减库存项目
2022/04/14 Redis
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android