请教一个关于数组的算法问题:如何对多维数组(数字)进行排序?

phoenix-sky 社区高级成员 T9 2021-01-20 09:30:37
请教一个关于数组的算法问题:如何对多维数组(数字)进行排序?
比如:
[2, [4, 6], 3, 9] -> [2, 3, [4, 6], 9]
[5, [6], [2], 20] -> [[2], 5, [6], 20]

需要用 sort()方法遍历吗?但是对于如何高性能实现还没有思路,想在这里请教大家,非常感谢!
...全文
188 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
phoenix-sky 社区高级成员 T9 2021-01-22
  • 打赏
  • 举报
回复
引用 5 楼 qybao 的回复:
[quote=引用 2 楼 phoenix.sky 的回复:]是的,这个问题存在。如果不考虑这种情况呢?谢谢!

给你写段例子代码,参考一下吧

//不考虑特殊情况的处理
const arrsort = arr => {
arr.sort((a, b) => { //用sort方法,分别针对两个参数元素都是数组的情况,一方是数组的情况,和双方都不是数组的情况给出相应的比较结果返回值
return Array.isArray(a) && Array.isArray(b) ? //两个都是数组的情况
(a.length>0 && b.length>0 ? a[0]-b[0] : (a.length>0 ? 1 : (b.length>0 ? -1 : 0)))
: Array.isArray(a) ? (a.length>0 ? a[0]-b : -1) //a是数组的情况
: Array.isArray(b) ? (b.length>0 ? a-b[0] : 1) //b是数组的情况
: a-b; //都不是数组的情况
});
return arr;
};
console.log(arrsort([2, [4, 6], 3, 9]));
console.log(arrsort([5, [6], [2], 20]));

//考虑特殊情况的处理
const arrsort2 = arr => {
arr.sort((a, b) => { //思路和上面相同
if (Array.isArray(a)) a = arrsort2(a); //只是多了把元素是数组的情况,先把元素自己本身排序(递归方式)
if (Array.isArray(b)) b = arrsort2(b);
return Array.isArray(a) && Array.isArray(b) ?
(a.length>0 && b.length>0 ? a[0]-b[0] : (a.length>0 ? 1 : (b.length>0 ? -1 : 0)))
: Array.isArray(a) ? (a.length>0 ? a[0]-b : -1)
: Array.isArray(b) ? (b.length>0 ? a-b[0] : 1)
: a-b;

});
return arr;
};
console.log(arrsort2([5, [6, 4], 3, 9]));
[/quote]您好, 我理解的有问题,有点绕,能否把里面的三元运算符拆分为 if 语句。 非常感谢!
qybao 2021-01-22
  • 打赏
  • 举报
回复
引用 6 楼 phoenix.sky 的回复:
[quote=引用 5 楼 qybao 的回复:]您好, 我理解的有问题,有点绕,能否把里面的三元运算符拆分为 if 语句。 非常感谢!
可以拆分为if
const arrsort = arr => {
    arr.sort((a, b) => {
        if (Array.isArray(a) && Array.isArray(b) ) { //两个都是数组的情况
            if (a.length>0 && b.length>0) { //a和b数组都不为空
                return a[0]-b[0]; //比较第一个元素
            } else if (a.length>0) { //a不为空,b位空
                return 1; //则a大
            } else if (b.length>0) { //a为空,b不为空
                return -1; //则b大
            } else { //两者都为空
                return 0; //则相等
            }
        } else if (Array.isArray(a)) { //a是数组的情况
            return (a.length>0 ? a[0]-b : -1); //这里之后的三目运算LZ就自己拆分为if吧
        } else if (Array.isArray(b)) { //b是数组的情况
            return (b.length>0 ? a-b[0] : 1)
        } else { //都不是数组的情况
            return a-b; 
        }
    });
    return arr;
};
console.log(arrsort([2, [4, 6], 3, 9]));
console.log(arrsort([5, [6], [2], 20]));
qybao 2021-01-21
  • 打赏
  • 举报
回复
对例子给出的需求有疑点, 比如对于[2, [6, 4], 5],期待的排序结果是什么?
phoenix-sky 社区高级成员 T9 2021-01-21
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
对例子给出的需求有疑点, 比如对于[2, [6, 4], 5],期待的排序结果是什么?
是的,这个问题存在。如果不考虑这种情况呢?谢谢!
qybao 2021-01-21
  • 打赏
  • 举报
回复
引用 2 楼 phoenix.sky 的回复:
是的,这个问题存在。如果不考虑这种情况呢?谢谢!

给你写段例子代码,参考一下吧

//不考虑特殊情况的处理
const arrsort = arr => {
arr.sort((a, b) => { //用sort方法,分别针对两个参数元素都是数组的情况,一方是数组的情况,和双方都不是数组的情况给出相应的比较结果返回值
return Array.isArray(a) && Array.isArray(b) ? //两个都是数组的情况
(a.length>0 && b.length>0 ? a[0]-b[0] : (a.length>0 ? 1 : (b.length>0 ? -1 : 0)))
: Array.isArray(a) ? (a.length>0 ? a[0]-b : -1) //a是数组的情况
: Array.isArray(b) ? (b.length>0 ? a-b[0] : 1) //b是数组的情况
: a-b; //都不是数组的情况
});
return arr;
};
console.log(arrsort([2, [4, 6], 3, 9]));
console.log(arrsort([5, [6], [2], 20]));

//考虑特殊情况的处理
const arrsort2 = arr => {
arr.sort((a, b) => { //思路和上面相同
if (Array.isArray(a)) a = arrsort2(a); //只是多了把元素是数组的情况,先把元素自己本身排序(递归方式)
if (Array.isArray(b)) b = arrsort2(b);
return Array.isArray(a) && Array.isArray(b) ?
(a.length>0 && b.length>0 ? a[0]-b[0] : (a.length>0 ? 1 : (b.length>0 ? -1 : 0)))
: Array.isArray(a) ? (a.length>0 ? a[0]-b : -1)
: Array.isArray(b) ? (b.length>0 ? a-b[0] : 1)
: a-b;

});
return arr;
};
console.log(arrsort2([5, [6, 4], 3, 9]));
phoenix-sky 社区高级成员 T9 2021-01-21
  • 打赏
  • 举报
回复
引用 3 楼 chinaskysun 的回复:
sort性能已经很好了
该如何用 sort() 方法实现多维数组排序呢?谢谢!
chinaskysun 2021-01-21
  • 打赏
  • 举报
回复
sort性能已经很好了
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。

87,922

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧