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 相关文章推荐
无闪烁更新网页内容JS实现
Dec 19 Javascript
JavaScript函数的4种调用方法详解
Apr 22 Javascript
javascript 中__proto__和prototype详解
Nov 25 Javascript
Javascript基础教程之数据类型转换
Jan 18 Javascript
js简单网速测试方法完整实例
Dec 15 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
May 31 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
Nov 15 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
Dec 19 Javascript
微信小程序 页面跳转和数据传递实例详解
Jan 19 Javascript
JS实现将对象转化为数组的方法分析
Jan 21 Javascript
扫微信小程序码实现网站登陆实现解析
Aug 20 Javascript
原生js实现下拉选项卡
Nov 27 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
世界第一个无线广播电台 KDKA
2021/03/01 无线电
PHP下对数组进行排序的函数
2010/08/08 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
Js nodeType 属性全面解析
2013/11/14 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
基于Vue的文字跑马灯组件(npm 组件包)
2017/05/24 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
解析Python编程中的包结构
2015/10/25 Python
Python装饰器用法示例小结
2018/02/11 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
python按比例随机切分数据的实现
2019/07/11 Python
PyCharm更改字体和界面样式的方法步骤
2019/09/27 Python
pytorch forward两个参数实例
2020/01/17 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
关于Python解包知识点总结
2020/05/05 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
python os.rename实例用法详解
2020/12/06 Python
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
汽车维修专业个人求职信范文
2014/01/01 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
入党培养人考察意见
2015/06/08 职场文书
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL
Windows Server 2019 域控制器安装图文教程
2022/04/28 Servers