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 面向对象 继承
May 13 Javascript
Firefox和IE兼容性问题及解决方法总结
Oct 08 Javascript
jQuery选择器全集详解
Nov 24 Javascript
30个经典的jQuery代码开发技巧
Dec 15 Javascript
JavaScript生成福利彩票双色球号码
May 15 Javascript
jquery使用each方法遍历json格式数据实例
May 18 Javascript
weUI应用之JS常用信息提示弹层的封装
Nov 21 Javascript
微信小程序 后台登录(非微信账号)实例详解
Mar 31 Javascript
jQuery树插件zTree使用方法详解
May 02 jQuery
Vue实现滑动拼图验证码功能
Sep 15 Javascript
vue 获取及修改store.js里的公共变量实例
Nov 06 Javascript
jQuery实现简易聊天框
Feb 08 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中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
YII框架http缓存操作示例
2019/04/29 PHP
javascript编程起步(第四课)
2007/02/27 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
Ajax基础知识详解
2017/02/17 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
Python使用folium excel绘制point
2019/01/03 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
python实现计算图形面积
2021/02/22 Python
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
应届生服装设计自我评价
2013/09/20 职场文书
视光学专业自荐信
2014/06/24 职场文书
学校周年庆活动方案
2014/08/22 职场文书
实习介绍信模板
2015/01/30 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
银行资信证明
2015/06/17 职场文书
创业计划书详解
2019/07/19 职场文书
nginx安装以及配置的详细过程记录
2021/09/15 Servers
Python 键盘事件详解
2021/11/11 Python