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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤
Apr 23 Javascript
Prototype Array对象 学习
Jul 19 Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
Dec 15 Javascript
能说明你的Javascript技术很烂的五个原因分析
Oct 28 Javascript
javascript采用数组实现tab菜单切换效果
Dec 12 Javascript
JavaScript中的this关键字介绍与使用实例
Jun 21 Javascript
整理Javascript事件响应学习笔记
Dec 02 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
May 18 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
Oct 20 Javascript
使用watch在微信小程序中实现全局状态共享
Jun 03 Javascript
layui实现checkbox的目录树tree的例子
Sep 12 Javascript
基于Cesium绘制抛物弧线
Nov 18 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常见的魔术方法详解
2014/12/25 PHP
php写app用的框架整理
2019/09/29 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
Python补齐字符串长度的实例
2018/11/15 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
自我评价优秀范文分享
2013/11/30 职场文书
企划专员岗位职责
2013/12/09 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
英语感恩演讲稿
2014/01/14 职场文书
数字化校园建设方案
2014/05/03 职场文书
反腐倡廉标语
2014/06/24 职场文书
买房协议书范本
2014/10/23 职场文书
2014年组织部工作总结
2014/11/14 职场文书
专家推荐信范文
2015/03/26 职场文书
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python