常用排序算法
1.冒泡排序
外层循环控制坑位,内层循环控制找到合适的数,两者循环方向相反。
function bubbleSort(arr){ for(var outer=arr.length-1;outer>0;outer--){ //每次循环填好一个坑;剩最后一个数时(下标为0)不用比较 for(var inner=0;inner<outer;inner++){ //找到合适的一个数,前后两个数比较;后面排好了的坑位不用循环 if(arr[inner]>arr[inner+1]){ //是否交换 var temp=arr[inner]; arr[inner]=arr[inner+1]; arr[inner+1]=temp; } } } }
2.选择排序
查找过程和冒泡排序相同,但交换次数会更少,性能更高。内外层循环方向相同。
function selectionSort(arr){ for(var outer=0;outer<arr.length;outer++){ //外层循环控制坑位,每次填一个坑位 var tempPos=outer,temp; //通过内层循环找出当此循环的最小值;因为js变量作用域的原因,tempPos必须重新赋值 for(var inner=outer+1;inner<arr.length;inner++){ //内部循环下标从外部循环坑位的后一个位置开始 if(arr[inner]<arr[tempPos]){ //如果外循环的值大于内循环的值,说明有更小的值,就将该值的下标保存在临时变量中 tempPos=inner; } } if(tempPos!=outer){ //内层循环结束,两个下标不一致时,将坑内的值和最小值交换一次就够了 temp=arr[outer]; arr[outer]=arr[tempPos]; arr[tempPos]=temp; } } }
3.插入排序
将无序的部分循环插入到有序的序列中,效率在这3者中最高。
function insertionSort(arr){ for(var outer=1;outer<arr.length;outer++){ //每次排序一个元素 var inner=outer; var temp=arr[outer]; while(temp<arr[inner-1]){ //之前的元素已经排好序。通过比较大小找到当前元素的正确位置;当前元素较小则之前的元素往后移动一格,直到将要排序的元素大于其值;最后在正确的位置上赋值。 arr[inner]=arr[inner-1]; //较大数后移一位 inner--; } arr[inner]=temp; } }
4.快速排序
对于大数据集处理最快
function quickSort(arr){ if(arr.length==0){ //递归结束条件 return []; } var left=[], right=[], devider=arr[0]; for(var i=1;i<arr.length;i++){ //以devider为界分成2边 if(arr[i]<devider){
left.push(arr[i]) }else{ right.push(arr[i]) } } return quickSort(left).concat(devider,quickSort(right)); //递归调用继续一分为二排序 }
以上皆为个人理解,如有错误之处,欢迎留言指正。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· 对象命名为何需要避免'-er'和'-or'后缀
· JDK 24 发布,新特性解读!
· Java24你发任你发,我用Java8
· C# 中比较实用的关键字,基础高频面试题!
· .NET Core奇技淫巧之WinForm使用Python.NET并打包