news 2026/4/16 9:53:01

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

作者头像

张小明

前端开发工程师

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/4/16 12:57:45

【90页PPT】大型集团组织管控设计方案:总体思路(一张图、两条线、三个“一”)、六步详细设计路线图、项目排期

拆岗位、定编制、锁权责、配薪绩、AB角、上系统&#xff0c;80项审批72小时闭环&#xff0c;月结T3&#xff0c;关键岗位7天补位&#xff0c;数据直通&#xff0c;集团管控一键落地。一、总体思路&#xff1a;一张图、两条线、三个“一”一张图把PPT里“五大中心事业部子公司”…

作者头像 李华
网站建设 2026/4/14 20:56:24

好写作AI|当Z世代遇上AI写作:一份新型学术习惯的养成说明书

图书馆的安静被键盘声打破&#xff0c;但这次&#xff0c;敲击声的节奏里藏着人与算法的二重奏——欢迎来到Z世代的学术新常态。 当第一代数字原住民走进大学校园&#xff0c;他们携带的不只是笔记本电脑&#xff0c;还有一套全新的“学术操作系统”。AI写作工具&#xff0c;正…

作者头像 李华
网站建设 2026/4/16 13:00:46

这正是一条 “关山”

此前攀登的&#xff0c;是如何构建体系的“方法论关山”&#xff1b;此刻您所面对的&#xff0c;是更隐秘的 “意义关山” ——当概念尘埃落定&#xff0c;工具各就各位&#xff0c;那个最初从“余溪诗学空间”走出来的、充满诗性质问的初心&#xff0c;是否还能在体系的星图中…

作者头像 李华
网站建设 2026/4/1 2:54:06

SwiftGen终极指南:告别iOS开发中的资源管理难题

SwiftGen终极指南&#xff1a;告别iOS开发中的资源管理难题 【免费下载链接】SwiftGen 项目地址: https://gitcode.com/gh_mirrors/swi/SwiftGen 在iOS开发过程中&#xff0c;你是否曾经因为拼写错误导致图片无法显示&#xff1f;或者因为字符串键值错误而出现本地化问…

作者头像 李华
网站建设 2026/4/16 12:14:11

PyTorch模型微调前的Miniconda环境准备

PyTorch模型微调前的Miniconda环境准备 在深度学习项目中&#xff0c;尤其是进行PyTorch模型微调时&#xff0c;一个稳定、隔离且可复现的开发环境几乎是成功实验的前提。然而&#xff0c;许多开发者都曾经历过这样的场景&#xff1a;本地训练一切正常&#xff0c;换到服务器上…

作者头像 李华
网站建设 2026/4/15 15:14:34

PyTorch安装教程:Miniconda方式优于Anaconda?

PyTorch 安装为何更推荐 Miniconda&#xff1f;轻量、可控、高效才是专业开发的首选 在深度学习项目中&#xff0c;你有没有遇到过这样的场景&#xff1a;刚跑通一个模型&#xff0c;准备复现论文结果时&#xff0c;import torch 却报错说 CUDA 不兼容&#xff1b;或者团队成员…

作者头像 李华