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类属性的访问方式详解
Feb 11 Javascript
JavaScript中的普通函数与构造函数比较
Apr 07 Javascript
基于jQuery实现select下拉选择可输入附源码下载
Feb 03 Javascript
jquery实现(textarea)placeholder自动换行
Dec 22 Javascript
Angular.js中定时器循环的3种方法总结
Apr 27 Javascript
bootstrap Table插件使用demo
Aug 07 Javascript
微信小程序图片选择区域裁剪实现方法
Dec 02 Javascript
Django模板继承 extend标签实例代码详解
May 16 Javascript
vue实现计算器功能
Feb 22 Javascript
微信小程序图片右边加两行文字的代码
Apr 23 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
Nov 12 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
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
js的event详解。
2006/09/06 Javascript
js的逻辑运算符 ||
2010/05/31 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
react-native封装插件swiper的使用方法
2018/03/20 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
python的re模块应用实例
2014/09/26 Python
pygame学习笔记(4):声音控制
2015/04/15 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
python:接口间数据传递与调用方法
2018/12/17 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
django的autoreload机制实现
2020/06/03 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
canvas 下载二维码和图片加水印的方法
2018/03/21 HTML / CSS
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
技术学校毕业生求职信分享
2013/12/02 职场文书
高三英语教学反思
2014/01/13 职场文书
期末自我鉴定
2014/01/23 职场文书
集体备课反思
2014/02/12 职场文书
渔夫的故事教学反思
2014/02/14 职场文书
锅炉工岗位职责
2015/02/13 职场文书
大四学生个人总结
2015/02/15 职场文书
后天观后感
2015/06/08 职场文书
海底两万里读书笔记
2015/06/26 职场文书
python编写函数注意事项总结
2021/03/29 Python