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 相关文章推荐
网页设计常用的一些技巧
Dec 22 Javascript
JS验证身份证有效性示例
Oct 11 Javascript
js实现正方形颜色从下往上升的效果
Aug 04 Javascript
10条建议帮助你创建更好的jQuery插件
May 18 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
May 25 Javascript
完美实现js选项卡切换效果(二)
Mar 08 Javascript
jQuery实现Select下拉列表进行状态选择功能
Mar 30 jQuery
使用百度地图实现地图网格的示例
Feb 06 Javascript
Vue实现按钮级权限方案
Nov 21 Javascript
原生js实现的金山打字小游戏(实例代码详解)
Mar 16 Javascript
es6函数name属性功能与用法实例分析
Apr 18 Javascript
JS ES6异步解决方案
Apr 29 Javascript
详解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显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
2017/11/20 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
2018/12/22 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
微信小程序实现消息框弹出动画
2020/04/18 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
微信小程序实现点赞业务
2021/02/10 Javascript
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
Python Json序列化与反序列化的示例
2018/01/31 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
python中reload重载实例用法
2020/12/15 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
中专毕业生个人职业生涯规划
2014/02/19 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js