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下function声明一些小结
Dec 28 Javascript
javascript 动态数据下的锚点错位问题解决方法
Dec 24 Javascript
JavaScript 比较时间大小的代码
Apr 24 Javascript
详解Javascript 装载和执行
Nov 17 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
Mar 04 Javascript
javascript中alert()与console.log()的区别
Aug 26 Javascript
JavaScript实现时间倒计时跳转(推荐)
Jun 28 Javascript
AngularJS中实现动画效果的方法
Jul 28 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
Nov 02 Javascript
详解javascript常用工具类的封装
Jan 30 Javascript
使用jquery Ajax实现上传附件功能
Oct 23 jQuery
vue element实现表格合并行数据
Nov 30 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
Banner程序
2006/10/09 PHP
Discuz! Passport 通行证整合
2008/03/27 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
angularjs中的单元测试实例
2014/12/06 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
vue二级菜单导航点击选中事件的方法
2018/09/12 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
Vue实现仿iPhone悬浮球的示例代码
2020/03/13 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
Python中逗号的三种作用实例分析
2015/06/08 Python
python进行TCP端口扫描的实现
2018/12/21 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
Python 导入文件过程图解
2019/10/15 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
tensorflow 实现数据类型转换
2020/02/17 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
试述DBMS的主要功能
2016/11/13 面试题
新年晚会主持词
2014/03/24 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
浅谈如何提高PHP代码的质量
2021/05/28 PHP
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
django 认证类配置实现
2021/11/11 Python
Spring中的@Transactional的工作原理
2022/06/05 Java/Android