当前位置: 首页 > Web前端 > JavaScript

【面试要求】常见的前端排序算法

时间:2023-03-27 14:43:34 JavaScript

前言算法可能没有前端程序员像后端程序员那样用得那么多,但是我们也要掌握一些基本的算法思想,是否是为了我们找一份工作普通的工作有很大的帮助。现在越来越多的公司会考察前端程序员的算法能力,所以我们有必要学习一下常见的前端算法的基本思想。如果本文对您有帮助,??关注+点赞??鼓励作者,文章公众号首发,关注前端南九第一时间获取最新文章~文章已收录在github中,欢迎关注tostar冒泡排序相信很多同学都不陌生。应该是我们最经典的算法了。无论你学习什么语言,你都可以看到它。基本思想:反复遍历待排序数组,每次比较两个元素的大小,如果顺序不对则交换两个元素的顺序。对数组重复比较,直到排序完成。该算法实现了比较两个相邻元素的基本步骤。如果第一个大于第二个,交换位置;对每对相邻的元素重复第一步,从开始的第一对到最后的最后一对,使得最后的元素应该是最大的数;对除最后一个以外的所有元素重复以上步骤;重复步骤1~3,直到排序完成。动画演示代码实现/***外层循环控制需要比较的元素。比如第一次排序后,最后一个元素不需要比较,内循环负责比较两个元素,把元素放在正确的位置*/functionbubbleSort(arr){constlen=arr.lengthfor(leti=0;iarr[j+1]){[arr[j],arr[j+1]]=[arr[j+1],arr[j]]//交换位置}}}returnarr}console.log(bubbleSort([3,44,15,36,26,27,2,46,4,19,50,48]))//[2,3,4,15,19,26,27,36,44,46,48,50]时间复杂度:O(n^2)快速排序算法说明快速排序是冒泡排序的一种改进算法,是处理大数据最快的排序算法之一。基本思想:是一种分而治之的算法,找到一个参考值,递归地将数据分解成包含较小元素和较大元素的不同子序列。该算法不断重复此步骤,直到所有数据都有序为止。算法实现的基本步骤选择一个参考元素,将列表拆分为两个子序列;重新排序列表,将所有小于参考值的元素放在参考值前面,将所有大于参考值的元素放在参考值后面;较小元素的子序列和较大元素的子序列重复步骤1和2动画演示代码实现函数quickSort(arr){if(arr.length<=1)returnarrconstleft=[],right=[],current=arr.splice(0,1)for(leti=0;i=0;j--){if(arr[j-1]>tem){arr[j]=arr[j-1]}else{arr[j]=tembreak}}}返回arr}console.log(insertSort([3,44,15,36,26,27,2,46,4,19,50,48]))//[2,3,4,15,19,26,27,36,44,46,48,50]时间复杂度O(n^2)选择排序算法说明选择排序是一种简单直观的排序算法,基本思想:首先选择待排序序列中的最小值或最大值,存入排序序列的起始位置,然后再继续从剩下的u中寻找最小或者最大的元素nsorted元素,并将其放在已排序序列的末尾。依此类推,直到所有元素都排序完毕。算法实现基本步骤的初始状态:无序区域为R[1..n],有序区域为空;当第i次排序(i=1,2,3...n-1)开始时,当前有序区域和无序区域分别为R[1..i-1]和R(i..n).这个排序过程从当前无序区中选出key最小的记录R[k],与无序区中的第一条记录R交换,使得R[1..i]和R[i+1..n)分别成为记录数增加的新有序区和记录数减少的新无序区;n-1遍结束,数组有序。动画演示代码实现/***假设第一个元素是最小的,然后通过循环找到最小的元素,*然后和第一个元素交换,然后假设第二个元素,重复上面的操作*/functionselectSort(arr){letlen=arr.length,minIndex,temfor(leti=0;itj,tk=1;根据增量序列的个数k,对序列进行k次排序;每次排序时,根据对应的增量ti,将待排序的列分成若干个长度为m的子序列,对每个子列表直接插入排序。只有当增量因子为1时,整个序列才被当作一个表,表的长度就是整个序列的长度。动画演示代码实现functionshellSort(arr){varlen=arr.length;for(vargap=Math.floor(len/2);gap>0;gap=Math.floor(gap/2)){for(vari=gap;i=0&¤t=arr[i]?最大值:arr[i]c[arr[i]]=c[arr[i]]?c[arr[i]]+1:1//count}for(leti=min;i=0;i--){b[c[arr[i]]-1]=arr[i]c[arr[i]]--}returnb}console.log(countingSort([2,3,8,7,1,2,2,2,7,3,9,8,2,1,4]))//[1,1,2,2,2,2,2,3,3,4,7,7,8,8,9]时间复杂度:O(n+k),k表示输入元素有n个介于0和k整数基数排序算法说明基数排序也是一种非比较排序算法,基本思想:先按低位排序,然后收集;然后按照高位排序,然后收集;以此类推,直到最高位置。有时候有些属性是有优先级的,先按低优先级排序,再按高优先级排序。最后的顺序是优先级高的在前,优先级高的和优先级低的在前。基数排序是基于分别排序和分别收集,所以比较稳定。算法的基本步骤是获取数组中的最大数,并获取位数;arr为原数组,从最低位开始取每位,组成基数数组;对基数进行计数排序(利用计数排序适用于小范围数的特点);动画演示代码实现functionradixSort(arr,maxDigit){letcounter=[],mod=10,dev=1;for(leti=0;i