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 相关文章推荐
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
Apr 29 Javascript
JavaScript Ajax编程 应用篇
Jul 02 Javascript
Javascript 事件冒泡机制详细介绍
Oct 10 Javascript
js的函数的按值传递参数(实例讲解)
Nov 16 Javascript
js 数组详细操作方法及解析合集
Jun 01 Javascript
深入浅析Vue中的 computed 和 watch
Jun 06 Javascript
基于element-ui的rules中正则表达式
Sep 04 Javascript
vue-router路由模式详解(小结)
Aug 26 Javascript
解决Vue调用springboot接口403跨域问题
Sep 02 Javascript
js实现删除json中指定的元素
Sep 22 Javascript
Openlayers显示地理位置坐标的方法
Sep 28 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中青蛙跳台阶的问题解决方法
2018/10/14 PHP
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
为开发者准备的10款最好的jQuery日历插件
2014/02/04 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
js实现列表按字母排序
2020/08/11 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
Python处理文本文件中控制字符的方法
2017/02/07 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
深入了解Python 方法之类方法 &amp; 静态方法
2020/08/17 Python
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
党员个人思想汇报
2013/12/28 职场文书
淘宝网店营销策划书
2014/01/11 职场文书
会议接待欢迎词
2014/01/12 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
表彰会主持词
2014/03/26 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
篮球友谊赛通讯稿
2014/10/10 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书