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 相关文章推荐
基于jquery的direction图片渐变动画效果
May 24 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
Aug 30 Javascript
关于javascript function对象那些迷惑分析
Oct 24 Javascript
jQuery中triggerHandler()方法用法实例
Jan 19 Javascript
javascript实现延时显示提示框特效代码
Apr 27 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
Jul 09 Javascript
jQuery获取table下某一行某一列的值实现代码
Apr 07 jQuery
fullPage.js和CSS3实现全屏滚动效果
May 05 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
Sep 18 Javascript
vue实现tab切换外加样式切换方法
Mar 16 Javascript
关于微信公众号开发无法支付的问题解决
Dec 28 Javascript
webpack proxy 使用(代理的使用)
Jan 10 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学习之PHP运算符
2006/10/09 PHP
PHP 加密与解密的斗争
2009/04/17 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
功能强大的php分页函数
2016/07/20 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
jquery设置控件位置的方法
2013/08/21 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
基于JQuery及AJAX实现名人名言随机生成器
2017/02/10 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
python基础教程之Hello World!
2014/08/29 Python
python字符串连接的N种方式总结
2014/09/17 Python
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
python定时执行指定函数的方法
2015/05/27 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
党员活动总结
2015/02/04 职场文书
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫