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学习笔记(十五) js间歇调用和超时调用
Jun 20 Javascript
php对mongodb的扩展(小试牛刀)
Nov 11 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
May 07 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
Jul 17 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
Aug 22 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
Jun 22 Javascript
input输入框内容实时监测(附代码)
Aug 15 Javascript
浅谈Vue SSR 的 Cookies 问题
Nov 20 Javascript
vuex actions传递多参数的处理方法
Sep 18 Javascript
JavaScript根据json生成html表格的示例代码
Oct 24 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
Mar 06 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
May 31 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笔试题
2009/08/04 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
YII路径的用法总结
2014/07/09 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
php文件包含的几种方式总结
2019/09/19 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
Python实现大文件排序的方法
2015/07/10 Python
Django中对数据查询结果进行排序的方法
2015/07/17 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
高中毕业生生活的自我评价
2013/12/08 职场文书
房地产广告词大全
2014/03/19 职场文书
入股协议书
2014/04/14 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
违纪学生保证书
2015/02/27 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL