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 相关文章推荐
Js 中debug方式
Feb 07 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
May 03 Javascript
浅析JavaScript访问对象属性和方法及区别
Nov 16 Javascript
简单谈谈JavaScript的同步与异步
Dec 31 Javascript
用原生js统计文本行数的简单示例
Aug 19 Javascript
wap手机端解决返回上一页的js实例
Dec 08 Javascript
JavaScript原生节点操作小结
Jan 17 Javascript
node.js实现登录注册页面
Apr 08 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
Apr 17 Javascript
Vue加载组件、动态加载组件的几种方式
Aug 31 Javascript
详解JavaScript栈内存与堆内存
Apr 04 Javascript
jQuery实现弹幕特效
Nov 29 jQuery
详解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 simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
Python如何判断数独是否合法
2016/09/08 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
python中正则表达式与模式匹配
2019/05/07 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
如何清空python的变量
2020/07/05 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
python里glob模块知识点总结
2021/01/05 Python
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
财务部岗位职责
2013/11/19 职场文书
开业典礼主持词
2014/03/21 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
2014年国庆标语
2014/06/30 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
婚前协议书范本两则
2014/10/16 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers
索尼ICF-5900W收音机测评
2022/04/24 无线电