JavaScript中几种排序算法的简单实现


Posted in Javascript onJuly 29, 2015

排序算法的实现

我的JS水平就是渣渣,所以我就用类似于JAVA和C的方式来写JavaScript的排序算法了。

而且这里我不讲算法原理,仅仅只是代码实现,可能会有Bug,欢迎大家博客评论指导。
插入排序

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

实现代码如下:

function insertSort(arr) {
  if (!arr) return;
  var len = arr.length;
  if (len == 0 || len == 1) return;

  for (var i = 1, len = arr.length; i < len; i ++) {
    var stand = arr[i];
    for (var j = i - 1; j >= 0; j --) {
      if (arr[j] > stand) {
        arr[j + 1] = arr[j];
      } else {
        arr[j + 1] = stand;
        break;
      }
    }
  }

  return arr;
}

 

时间复杂度为:O(n^2)

当然,该算法是有优化余地的,例如将搜索替换的位置算法改为二分查找。
冒泡排序

经典的排序算法,提到冒泡排序我就心痛。本科时候的必须论文的冒泡排序算法的改进,结果写完论文之后都不能完整的实现冒泡排序算法,好尴尬。

if (!arr) return;
  var len = arr.length;
  if (len == 0 || len == 1) return;

  for (var i = 0; i < len; i ++) {
    for (var j = 0; j < len - i - 1; j ++) {
      if (arr[j] > arr[j + 1]) {
        var tmp = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = tmp;
      }
    }
  }

  return arr;
}

时间复杂度为:O(n^2)
快速排序

非常经典的排序算法,排序过程主要i分为三步:

  1.     从数列中挑出一个元素,称为 “基准”(pivot);
  2.     重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3.     递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

实现代码如下:

function quickSort(arr, bt, ed) {
  if (bt < ed) {
    var pivot = findPartition(arr, bt, ed);
    quickSort(arr, bt, pivot - 1);
    quickSort(arr, pivot + 1, ed);
  }
}

function findPartition(arr, bt, ed) {
  var stand = arr[bt];

  while (bt < ed) {
    while (bt < ed && arr[ed] >= stand) {
      ed --;
    }
    if (bt < ed) {
      arr[bt ++] = arr[ed];
    }
    while (bt < ed && arr[bt] <= stand) {
      bt ++;
    }
    if (bt < ed) {
      arr[ed --] = arr[bt]; 
    }
  }

  arr[bt] = stand;
  return bt;
}

时间复杂度为:O(nlogn)。
归并排序

也是非常经典的排序算法,我就是借着学习js的机会复习经典的排序算法了。归并排序的思想可以参考我的这篇博客:归并排序。我这里只写js实现。

function mergeSort(arr, bt, ed) {
  if (bt < ed) {
    var mid = bt + parseInt((ed - bt) / 2);
    mergeSort(arr, bt, mid);
    mergeSort(arr, mid + 1, ed);
    mergeArray(arr, bt, mid, ed);    
  }
}

function mergeArray(arr, bt, mid, ed) {
  var mArr = [];
  var i = bt, j = mid + 1;
  while (i <= mid && j <= ed) {
    if (arr[i] <= arr[j]) {
      mArr.push(arr[i++]);
    } else {
      mArr.push(arr[j ++]);
    }
  }

  if (i <= mid) {
    mArr = mArr.concat(arr.slice(i, mid + 1));
  }

  if (j <= ed) {
    mArr = mArr.concat(arr.slice(j, ed + 1));
  }

  for (var h = 0; h < mArr.length; h ++) {
    arr[bt + h] = mArr[h];
  }
}

写归并排序的时候还有一个小插曲:就是js不能自动取整,后来用了parseInt方法,感觉萌萌大。

 

Javascript 相关文章推荐
javascript 定义新对象方法
Feb 20 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
Feb 03 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
Jul 31 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
Nov 25 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
Jun 13 Javascript
vuejs实现本地数据的筛选分页功能思路详解
Nov 15 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
Aug 09 Javascript
Bootstrap Table实现定时刷新数据的方法
Aug 13 Javascript
React 无状态组件(Stateless Component) 与高阶组件
Aug 14 Javascript
vue 实现边输入边搜索功能的实例讲解
Sep 16 Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 Javascript
vue中watch的用法汇总
Dec 28 Vue.js
详解JavaScript中数组的相关知识
Jul 29 #Javascript
javascript+canvas实现刮刮卡抽奖效果
Jul 29 #Javascript
js实现登陆遮罩效果的方法
Jul 28 #Javascript
怎么通过onclick事件获取js函数返回值(代码少)
Jul 28 #Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
Jul 28 #Javascript
简单的jQuery入门指引
Jul 28 #Javascript
PageSwitch插件实现100种不同图片切换效果
Jul 28 #Javascript
You might like
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
php 批量替换程序的具体实现代码
2013/10/04 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
IE与firefox之jquery用法区别
2008/10/03 Javascript
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
python正则表达式之作业计算器
2016/03/18 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
Pycharm安装python库的方法
2020/11/24 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
标准的毕业生自荐信
2014/04/20 职场文书
服务明星事迹材料
2014/12/29 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python
JavaScript原型链详解
2021/11/07 Javascript