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 相关文章推荐
腾讯UED 漂亮的提示信息效果代码
Sep 12 Javascript
jQuery中:first-child选择器用法实例
Dec 31 Javascript
jQuery中insertBefore()方法用法实例
Jan 08 Javascript
Javascript递归打印Document层次关系实例分析
May 15 Javascript
在Html中使用Requirejs进行模块化开发实例详解
Apr 15 Javascript
JavaScript关于提高网站性能的几点建议(一)
Jul 24 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
Nov 20 Javascript
mpvue全局引入sass文件的方法步骤
Mar 06 Javascript
JS获取本地地址及天气的方法实例小结
May 10 Javascript
Vue.js组件使用props传递数据的方法
Oct 19 Javascript
js前端如何写一个精确的倒计时代码
Oct 25 Javascript
vue el-upload上传文件的示例代码
Dec 21 Vue.js
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
重置版战役片段
2020/04/09 魔兽争霸
php桌面中心(一) 创建数据库
2007/03/11 PHP
php URL验证正则表达式
2011/07/19 PHP
php 文本文件的读取效率
2012/02/10 PHP
yii中widget的用法
2014/12/03 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
使用python绘制人人网好友关系图示例
2014/04/01 Python
基于python实现聊天室程序
2018/07/27 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
RetroStage德国:复古服装
2019/02/03 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
小学语文教学反思
2014/02/10 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
党的作风建设心得体会
2014/10/22 职场文书
事业单位个人总结
2015/02/12 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书