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 相关文章推荐
AJAX架构之Dojo篇
Apr 10 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
Aug 13 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
Mar 18 Javascript
jQuery带箭头提示框tooltips插件集锦
Nov 17 Javascript
javascript封装简单实现方法
Aug 11 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
Apr 28 Javascript
详解Node.js 命令行程序开发教程
Jun 07 Javascript
AngularJS中filter的使用实例详解
Aug 25 Javascript
JS库之Highlight.js的用法详解
Sep 13 Javascript
详解小程序缓存插件(mrc)
Aug 17 Javascript
微信小程序云开发之使用云函数
May 17 Javascript
javascript数组的定义及操作实例
Nov 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
第十四节--命名空间
2006/11/16 PHP
PHP 安全检测代码片段(分享)
2013/07/05 PHP
11个PHPer必须要了解的编程规范
2014/09/22 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
jQuery html()等方法介绍
2009/11/18 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
关于Vue中axios的封装实例详解
2019/10/20 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
python中实现字符串翻转的方法
2018/07/11 Python
Python微信操控itchat的方法
2019/05/31 Python
Django--权限Permissions的例子
2019/08/28 Python
使用OpCode绕过Python沙箱的方法详解
2019/09/03 Python
PageFactory设计模式基于python实现
2020/04/14 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
平面设计师工作职责范文
2013/12/03 职场文书
高级销售求职信
2014/02/21 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
六年级学生期末评语
2014/12/26 职场文书
超级礼物观后感
2015/06/15 职场文书
运动会加油稿50字
2015/07/21 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python