news 2026/6/25 17:43:15

前端排序算法大全:从冒泡到实战的趣味指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端排序算法大全:从冒泡到实战的趣味指南

❤ 写在前面
如果觉得对你有帮助的话,点个小❤❤ 吧,你的支持是对我最大的鼓励~
个人独立开发wx小程序,感谢支持!


📊 排序,不就是排座位吗?

想象一下,你是一位班主任,需要给全班同学按身高排座位——这就是排序!在前端开发中,我们每天都在进行各种“排座位”操作:商品按价格排序、文章按时间排序、用户按姓名排序…

但你知道吗?排座位的方式有很多种,有的快速但混乱,有的稳定但慢速。今天我们就来探索前端开发中那些有趣的排序方式!

🎯 排序算法分类图

前端排序算法

基础排序算法

高级排序算法

JavaScript内置排序

冒泡排序

选择排序

插入排序

快速排序

归并排序

堆排序

Array.sort
默认算法

自定义比较函数

🔥 基础排序算法:三大经典招式

1. 冒泡排序 - “相邻交换法”

就像气泡从水底升到水面一样,每次比较相邻元素,把大的“冒”到后面。

// 冒泡排序实现functionbubbleSort(arr){for(leti=0;i<arr.length;i++){for(letj=0;j<arr.length-i-1;j++){// 相邻元素比较,大的往后冒if(arr[j]>arr[j+1]){[arr[j],arr[j+1]]=[arr[j+1],arr[j]];// ES6解构交换}}}returnarr;}// 试试看!console.log(bubbleSort([5,3,8,1,2]));// [1, 2, 3, 5, 8]

适用场景:教学演示、小数据量排序

2. 选择排序 - “选最小放前面”

每次找到最小的元素,放到已排序序列的末尾。

functionselectionSort(arr){for(leti=0;i<arr.length;i++){letminIndex=i;// 找最小值的索引for(letj=i+1;j<arr.length;j++){if(arr[j]<arr[minIndex]){minIndex=j;}}// 把最小值放到前面[arr[i],arr[minIndex]]=[arr[minIndex],arr[i]];}returnarr;}

3. 插入排序 - “扑克牌整理法”

就像整理扑克牌,每次把新牌插入到合适位置。

functioninsertionSort(arr){for(leti=1;i<arr.length;i++){letcurrent=arr[i];letj=i-1;// 向前找到合适位置插入while(j>=0&&arr[j]>current){arr[j+1]=arr[j];j--;}arr[j+1]=current;}returnarr;}

⚡ 高级排序算法:效率之选

快速排序 - “分而治之的王者”

选择一个基准,把小于基准的放左边,大于的放右边,然后递归处理。

functionquickSort(arr){if(arr.length<=1)returnarr;constpivot=arr[Math.floor(arr.length/2)];constleft=[];constright=[];constequal=[];for(letitemofarr){if(item<pivot)left.push(item);elseif(item>pivot)right.push(item);elseequal.push(item);}return[...quickSort(left),...equal,...quickSort(right)];}

时间复杂度:平均O(n log n),最坏O(n²)

🚀 JavaScript内置排序:Array.sort()

这才是我们日常最常用的!但你知道它默认按字符串Unicode排序吗?

// 惊喜还是惊吓?[10,2,1].sort();// [1, 10, 2] 😱// 正确方式:提供比较函数[10,2,1].sort((a,b)=>a-b);// [1, 2, 10] ✅

📈 排序算法选择流程图

小数据量
(< 100)

大数据量


(相同值保持原顺序)

充足

紧张

需要排序?

数据量大小

基础算法即可
冒泡/选择/插入

是否需要稳定排序?

归并排序

内存是否充足?

快速排序
通常最快

堆排序

使用JavaScript的
Array.sort
V8引擎自动优化

完成排序!🎉

💡 实战应用场景

场景1:电商商品排序

// 按价格排序products.sort((a,b)=>a.price-b.price);// 多条件排序:先按销量,再按评分products.sort((a,b)=>{if(a.sales!==b.sales){returnb.sales-a.sales;// 销量降序}returnb.rating-a.rating;// 评分降序});

场景2:表格动态排序

// 可配置的表格排序functionsortTable(data,key,direction='asc'){return[...data].sort((a,b)=>{constaVal=a[key];constbVal=b[key];if(direction==='asc'){returnaVal<bVal?-1:aVal>bVal?1:0;}else{returnaVal>bVal?-1:aVal<bVal?1:0;}});}

场景3:中文排序

// 中文按拼音排序constchineseNames=['张三','李四','王五'];chineseNames.sort((a,b)=>a.localeCompare(b,'zh-CN'));

🎨 可视化排序过程(有趣实现)

// 动画演示冒泡排序asyncfunctionvisualBubbleSort(arr,updateUI){for(leti=0;i<arr.length;i++){for(letj=0;j<arr.length-i-1;j++){// 高亮比较的元素updateUI(arr,{comparing:[j,j+1]});awaitdelay(300);// 暂停一下,让用户看清if(arr[j]>arr[j+1]){[arr[j],arr[j+1]]=[arr[j+1],arr[j]];// 更新UI显示交换updateUI(arr,{swapping:[j,j+1]});awaitdelay(300);}}}updateUI(arr,{sorted:true});}

📊 性能对比表

算法平均时间复杂度最佳情况最坏情况是否稳定使用场景
冒泡排序O(n²)O(n)O(n²)教学、小数据
选择排序O(n²)O(n²)O(n²)小数据量
插入排序O(n²)O(n)O(n²)近乎有序的数据
快速排序O(n log n)O(n log n)O(n²)通用、大数据
归并排序O(n log n)O(n log n)O(n log n)需要稳定排序
Array.sortO(n log n)O(n log n)O(n log n)日常开发

🏆 总结与建议

  1. 日常开发:直接用Array.sort(),现代JavaScript引擎已经高度优化
  2. 面试准备:理解各种排序原理,能手写1-2种即可
  3. 特殊需求:根据数据特点选择合适算法
  4. 性能关键:大数据量时,优先考虑快速排序或归并排序

记住,最好的排序算法不一定是理论上最快的,而是最适合你当前场景的!


彩蛋:试试这个"睡眠排序"(仅供娱乐,切勿生产使用!):

// 绝对不要在工作中使用这个!functionsleepSort(arr){arr.forEach(num=>{setTimeout(()=>console.log(num),num*10);});}

希望这篇博客让你对前端排序有了新的认识!在实际开发中,理解原理比死记硬背更重要。Happy coding! 🚀


点赞收藏这篇博客,下次面试被问到排序算法时,你就是最靓的仔!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/20 1:47:45

GLM-Z1-9B-0414完整部署指南:5分钟搞定数学推理专家

GLM-Z1-9B-0414完整部署指南&#xff1a;5分钟搞定数学推理专家 【免费下载链接】GLM-Z1-9B-0414 项目地址: https://ai.gitcode.com/zai-org/GLM-Z1-9B-0414 想要快速部署一款专注于数学推理的开源大语言模型吗&#xff1f;GLM-Z1-9B-0414作为智谱AI推出的90亿参数模型…

作者头像 李华
网站建设 2026/6/22 1:56:54

Spring Boot示例项目:快速上手的完整开发指南

Spring Boot示例项目&#xff1a;快速上手的完整开发指南 【免费下载链接】spring-boot-samples Spring Boot samples by Netgloo 项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot-samples Spring Boot示例项目是由Netgloo团队精心打造的开源学习资源&#xf…

作者头像 李华
网站建设 2026/6/24 19:04:09

Miniconda配合Docker实现PyTorch环境容器化

Miniconda 配合 Docker 实现 PyTorch 环境容器化 在深度学习项目开发中&#xff0c;环境配置的“在我机器上能跑”问题始终是团队协作和实验复现的一大障碍。一个典型的场景是&#xff1a;你在本地训练好的模型&#xff0c;在服务器上报错说 torch 版本不兼容&#xff1b;或者…

作者头像 李华
网站建设 2026/6/22 19:07:47

完整指南:为什么Elk是Mastodon用户的理想Web客户端选择

完整指南&#xff1a;为什么Elk是Mastodon用户的理想Web客户端选择 【免费下载链接】elk A nimble Mastodon web client 项目地址: https://gitcode.com/gh_mirrors/el/elk 想象一下&#xff0c;当你第一次接触去中心化社交媒体时&#xff0c;面对复杂的界面和繁琐的操作…

作者头像 李华
网站建设 2026/6/18 9:11:49

vivado2025开发准备指南:驱动与许可证配置详解

vivado2025开发准备避坑指南&#xff1a;驱动与许可证配置实战全解析 你是不是也经历过这样的场景&#xff1f; 刚装好 vivado2025 &#xff0c;兴冲冲打开IDE&#xff0c;结果连不上板子&#xff1b;或者Hardware Manager里一片空白&#xff0c;提示“ No hardware target…

作者头像 李华