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 表格排序、实时搜索表格内容(附图)
May 19 Javascript
理解JavaScript的变量的入门教程
Jul 07 Javascript
10个很棒的jQuery代码片段
Sep 24 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 Javascript
浅谈react+es6+webpack的基础配置
Aug 09 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
Sep 19 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
Aug 27 Javascript
angular6的响应式表单的实现
Oct 10 Javascript
详解Vue 动态组件与全局事件绑定总结
Nov 11 Javascript
Vue 刷新当前路由的实现代码
Sep 26 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
Dec 30 jQuery
JS实现页面炫酷的时钟特效示例
Aug 14 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获取数组中重复数据的两种方法
2013/06/28 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
Yii2.0中的COOKIE和SESSION用法
2016/08/12 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
jquery json 实例代码
2010/12/02 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
vue中的scope使用详解
2017/10/29 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
JavaScript编写开发动态时钟
2020/07/29 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
Python列表与元组的异同详解
2019/07/02 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
Python configparser模块常用方法解析
2020/05/22 Python
2014年健康教育实施方案
2014/02/17 职场文书
我的画教学反思
2014/04/28 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
求职简历自我评价2015
2015/03/10 职场文书
导游词之襄阳古城
2019/09/27 职场文书
python实现过滤敏感词
2021/05/08 Python
redis数据结构之压缩列表
2022/03/21 Redis
Github 使用python对copilot做些简单使用测试
2022/04/14 Python