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 相关文章推荐
Extjs学习笔记之一 初识Extjs之MessageBox
Jan 07 Javascript
JQuery 操作Javascript对象和数组的工具函数小结
Jan 22 Javascript
JS随机生成不重复数据的实例方法
Jul 17 Javascript
js数组操作常用方法
May 08 Javascript
JavaScript插件化开发教程 (四)
Jan 27 Javascript
基于jquery实现人物头像跟随鼠标转动
Aug 23 Javascript
vue.js中Vue-router 2.0基础实践教程
May 08 Javascript
浅谈Webpack自动化构建实践指南
Dec 18 Javascript
js判断输入框不能为空格或null值的实现方法
Mar 02 Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 Javascript
如何在vue 中引入使用jquery
Nov 10 jQuery
浅谈node.js中间件有哪些类型
Apr 29 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
ini_set的用法介绍
2014/01/07 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
php简单统计中文个数的方法
2016/09/30 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
asp.net和php的区别点总结
2019/10/10 PHP
用Juery网页选项卡实现代码
2011/06/13 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
js正则表达式注册页面表单验证
2016/10/11 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
python使用matplotlib绘制柱状图教程
2017/02/08 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
pytorch中的inference使用实例
2020/02/20 Python
python学习笔记之多进程
2020/08/06 Python
自荐书模板
2013/12/19 职场文书
超市总经理岗位职责
2014/02/02 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
教师演讲稿开场白
2014/08/25 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
多人股份制合作协议书
2016/03/19 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技