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 相关文章推荐
List all the Databases on a SQL Server
Jun 21 Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
Dec 20 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
Jan 13 Javascript
Js获取下拉框选定项的值和文本的实现代码
Feb 26 Javascript
js动态创建标签示例代码
Jun 09 Javascript
Node.js编码规范
Jul 14 Javascript
bootstrap的常用组件和栅格式布局详解
May 02 Javascript
20行JS代码实现粘贴板复制功能
Feb 06 Javascript
你应该了解的JavaScript Array.map()五种用途小结
Nov 14 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
Mar 07 Javascript
JQuery属性操作与循环用法示例
May 15 jQuery
JS实现斐波那契数列的五种方式(小结)
Sep 09 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 curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
2015/03/18 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
vue-element-admin 菜单标签失效的解决方式
2019/11/12 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
vue $mount 和 el的区别说明
2020/09/11 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
Python 通过URL打开图片实例详解
2017/06/01 Python
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
高中体育教学反思
2014/01/24 职场文书
小学生考试获奖感言
2014/01/30 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
大学生活动总结模板
2014/07/02 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
工伤事故赔偿协议书
2014/10/27 职场文书
授权委托书
2015/01/28 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
《比的意义》教学反思
2016/02/18 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
pytorch 6 batch_train 批训练操作
2021/05/28 Python