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 相关文章推荐
需要做特殊处理的DOM元素属性的访问
Nov 05 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
Mar 01 Javascript
jQuery Ajax提交表单查询获得数据实例代码
Sep 19 Javascript
JavaScript对象的property属性详解
Apr 01 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
Mar 14 Javascript
深入浅析knockout源码分析之订阅
Jul 12 Javascript
提高JavaScript执行效率的23个实用技巧
Mar 01 Javascript
js 去掉字符串前后空格实现代码集合
Mar 25 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
Apr 07 Javascript
Angular.JS通过指令操作DOM的方法
May 10 Javascript
微信小程序 接入腾讯地图的两种写法
Jan 12 Javascript
浅谈JavaScript浅拷贝和深拷贝
Nov 07 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实现比较两个字符串日期大小的方法
2015/05/12 PHP
php中的异常和错误浅析
2017/05/03 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
Smarty模板配置实例简析
2019/07/20 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
JS实现可以用键盘方向键控制的动画
2020/12/11 Javascript
Python编写检测数据库SA用户的方法
2014/07/11 Python
python求列表交集的方法汇总
2014/11/10 Python
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
python先序遍历二叉树问题
2017/11/10 Python
Python中super函数的用法
2017/11/17 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
Python生成器generator用法示例
2018/08/10 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
人力资源管理专业学生自我评价
2013/11/20 职场文书
采购部主管岗位职责
2014/01/01 职场文书
安全协议书
2014/04/23 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
《废话连篇——致新手》——chinapizza
2022/04/05 无线电
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang