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写的一个DIV 弹出网页对话框
Aug 14 Javascript
javascript 函数使用说明
Apr 07 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
Jan 08 Javascript
判断js对象是否拥有某一个属性的js代码
Aug 16 Javascript
Javascript中各种trim的实现详细解析
Dec 10 Javascript
js控制table合并具体实现
Feb 20 Javascript
Jquery自定义button按钮的几种方法
Jun 11 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
Dec 01 Javascript
JavaScript模拟实现键盘打字效果
Jun 29 Javascript
BootStrap TreeView使用实例详解
Nov 01 Javascript
深入理解Vue官方文档梳理之全局API
Nov 22 Javascript
tangram.js库实现js类的方式实例分析
Jan 06 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的curl实现get和post的代码
2008/08/23 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
vue.js中created方法作用
2018/03/30 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
Python+PIL实现支付宝AR红包
2018/02/09 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
python使用Plotly绘图工具绘制气泡图
2019/04/01 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
python利用os模块编写文件复制功能——copy()函数用法
2020/07/13 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
社区七一党员活动方案
2014/01/25 职场文书
开展读书活动总结
2014/06/30 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
golang 接口嵌套实现复用的操作
2021/04/29 Golang
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
oracle数据库去除重复数据
2022/05/20 Oracle