JavaScript数组排序的六种常见算法总结


Posted in Javascript onAugust 18, 2020

前言

着急用的话,选择前两个就行了,后面的看看就好。

开发中,遇到数组排序的需求很频繁,这篇文章会介绍几个常见排序思路。

一、希尔排序(性能最好)

如果要从大到小排列,则 while(arr[n] > arr[n - interval] && n > 0) 。

// 希尔排序算法
function xier(arr){
 var interval = parseInt(arr.length / 2);//分组间隔设置
 while(interval > 0){
  for(var i = 0 ; i < arr.length ; i ++){
   var n = i;
   while(arr[n] < arr[n - interval] && n > 0){
    var temp = arr[n];
    arr[n] = arr[n - interval];
    arr[n - interval] = temp;
    n = n - interval;
   }
  }
  interval = parseInt(interval / 2);
 }
 return arr;
}

// Array
var arr = [10, 20, 40, 60, 60, 0, 30]

// 打印排序后的数组
console.log(xier(arr))//[0, 10, 20, 30, 40, 60, 60]

二、sort排序(普通数组 / 数组嵌套对象)

一堆数组排序

// Array
var arr = [10, 20, 40, 60, 60, 0, 30]

// 排序方法
arr.sort(function(a,b){

 /*
 * return b-a; —> 降序排序
 * return a-b; —> 升序排列
 */
 return a-b;
})//括号里不写回调函数则默认按照字母逐位升序排列

// 打印排序后的数组
console.log(arr)//[0, 10, 20, 30, 40, 60, 60]

对象数组排序(数组套对象)

//对象数组排序
var arr = [
 {name:'syy', age:0},
 {name:'wxy', age:18},
 {name:'slj', age:8},
 {name:'wj', age:20}
];

// 排序方法
function compare(property) {//property:根据什么属性排序
 return function(a,b){
  var value1 = a[property];
  var value2 = b[property];
  /*
  * value2 - value1; ——> 降序
  * value1 - value2; ——> 升序
  */
  return value1 - value2;//升序排序
 }
}

// 打印排序后的数组
console.log(arr.sort(compare('age')))
/*
0: {name: "syy", age: 0}
1: {name: "slj", age: 8}
2: {name: "wxy", age: 18}
3: {name: "wj", age: 20}
*/

三、桶排序

特点:简单,但非常浪费内存,几乎不用。

桶中出现的数组元素都做个标记 1,然后将桶数组中有 1 标记的元素依次打印。

// Array
var arr = []

// 每个数组项做标记(1)
for(let i = 0; i < arr.length; i++) {
 let key = arr[i]
 arr[key] = 1
}

// 遍历打印出每项
for(let j in arr) {
 debugger
 console.log(j)
}

四、冒泡排序

性能:一般(需要每项进行比较)。

每一趟找出最大的值。

// Array
var arr = [10, 20, 40, 60, 60, 0, 30]

/*
* 总共比较次数为arr.length-1次
* 每次的比较次数为arr.length-1次
* 依次递减
*/
var temp;//交换变量标识

// 两层for分别表示当前项与第二项
for(let i = 0; i < arr.length - 1; i++) {
 for(let j = 0; j < arr.length - 1; j++) {

  // 如果当前项大于第二项(后一项)则交换
  if(arr[j] > arr[j+1]) {
   temp = arr[j]
   arr[j] = arr[j+1];
   arr[j+1] = temp;
  }
 }
}

// 打印排序后的数组
console.log(arr)//[0, 10, 20, 30, 40, 60, 60]

五、选择排序

性能:一般(需要每项进行比较)。

假定某个位置的值是最小值,与冒泡排序类似。

// Array
var arr = [10, 20, 40, 60, 60, 0, 30]


var temp;//交换变量标识

// 两层for分别表示当前项与第二项
for(let i = 0; i < arr.length - 1; i++) {
 for(let j = i + 1; j < arr.length; j++) {

  // 假设第二项是最小值(是则交换/否则继续比较)
  if(arr[i] > arr[j]) {
   temp = arr[i];
   arr[i] = arr[j];
   arr[j] = temp;
  }
 }
}

// 打印排序后的数组
console.log(arr)//[0, 10, 20, 30, 40, 60, 60]

六、插入排序

// Array
var arr = [10, 20, 40, 60, 60, 0, 30]

// 排序算法
for(var i = 0; i < arr.length; i++) {
 var n = i;
 while(arr[n] > arr[n+1] && n >= 0) {
 	 var temp = arr[n];
	 arr[n] = arr[n+1];
 	 arr[n+1] = temp;
	 n--;
 }
}

// 打印排序后的数组
console.log(arr)//[0, 10, 20, 30, 40, 60, 60]

总结

到此这篇关于JavaScript数组排序的六种常见算法总结的文章就介绍到这了,更多相关JavaScript数组排序常见算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery 插件开发备注
Aug 27 Javascript
JS OffsetParent属性深入解析
Jan 13 Javascript
node.js中的fs.realpath方法使用说明
Dec 16 Javascript
jQuery简单实现日历的方法
May 04 Javascript
JS平滑无缝滚动效果的实现代码
May 06 Javascript
使用JavaScript实现ajax的实例代码
May 11 Javascript
JS获得多个同name 的input输入框的值的实现方法
Jan 09 Javascript
Node.JS利用PhantomJs抓取网页入门教程
May 19 Javascript
详解AngularJS controller调用factory
May 19 Javascript
详解基于webpack2.x的vue2.x的多页面站点
Aug 21 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
Oct 07 Javascript
Vue项目中配置pug解析支持
May 10 Javascript
js实现简单扫雷
Nov 27 #Javascript
基于JavaScript实现大文件上传后端代码实例
Aug 18 #Javascript
javascript实现扫雷简易版
Aug 18 #Javascript
详解Vue的组件中data选项为什么必须是函数
Aug 17 #Javascript
Openlayers实现扩散的动态点(水纹效果)
Aug 17 #Javascript
openLayer4实现动态改变标注图标
Aug 17 #Javascript
openlayers4实现点动态扩散
Aug 17 #Javascript
You might like
PHP Memcached应用实现代码
2010/02/08 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
在vue中使用vant TreeSelect分类选择组件操作
2020/11/02 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
Python3访问并下载网页内容的方法
2015/07/28 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
全面分析Python的优点和缺点
2018/02/07 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
对Python中内置异常层次结构详解
2018/10/18 Python
Django 视图层(view)的使用
2018/11/09 Python
python实现贪吃蛇小游戏
2020/03/21 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
如何在C# winform中异步调用web services
2015/09/21 面试题
产品销售员岗位职责
2013/12/18 职场文书
审计专业自荐信范文
2014/04/21 职场文书
自主招生推荐信范文
2014/05/10 职场文书
上班迟到检讨书范文
2015/05/06 职场文书
微信早安问候语
2015/11/10 职场文书
2016简单的租房合同范本
2016/03/18 职场文书