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

前端必会的七种排序算法

时间:2023-04-05 18:11:03 HTML5

前端必须知道的七种排序算法Easy,所以小编准备从最基础的七种排序算法入手。前方高能,请抢方向盘...1.冒泡排序冒泡排序的思想:遍历数组,然后将最大的数沉到底;
时间复杂度:O(N^2);
空间复杂度:O(1)functionBubbleSort(arr){if(arr==null||arr.length<=0){return[];}varlen=arr.length;for(varend=len-1;end>0;end--){for(vari=0;iarr[i+1]){swap(arr,我,我+1);}}}returnarr;}functionswap(arr,i,j){//vartemp=arr[i];//arr[i]=arr[j];//arr[j]=temp;//也可以使用XOR运算符进行交换arr[i]=arr[i]^arr[j];arr[j]=arr[i]^arr[j];arr[i]=arr[i]^arr[j];}  二、选择排序选择排序的实现思路:遍历数组,把最小的数放在最前面;
时间复杂度:O(N^2);
空间复杂度:O(1)functionSelectionSort(arr){if(arr==null||arr.length<0){return[];}for(vari=0;i时间复杂度:O(N^2);
空间复杂度:O(1)functioninsertSort(arr){if(arr==null||arr.length<=0){return[];}varlen=arr.length;for(vari=1;i=0&&arr[j]>arr[j+1];j--){swap(arr,j,j+1);}}returnarr;}functionswap(arr,i,j){vartemp=arr[i];arr[i]=arr[j];arr[j]=temp;}4.合并和排序合并和排序想法:
1。首先对左边的部分进行排序
2。按顺序排列正确的部分
3。准备一个辅助数组,使用外排法,从小的开始填充,直到一个移动到最后,复制另一个数组的剩余部分到最后
4。将辅助数组复制回原数组
时间复杂度:O(NlogN)
空间复杂度:O(N)*//递归实现函数mergeSort(arr){if(arr==null||arr.length<=0){return[];}sortProcess(arr,0,arr.length-1);returnarr;}functionsortProcess(arr,L,R){//递归的终止条件是左右边界索引相同if(L==R){return;}varmiddle=L+((R-L)>>1);//找出中间值sortProcess(arr,L,middle);//传递左边的部分returntosortProcess(arr,middle+1,R);//递归合并右边的部分(arr,L,middle,R);//然后用外排的方法合并}functionmerge(arr,L,middle,R){varhelp=[];varl=L;varr=中间+1;varindex=0;//使用流出while(l<=middle&&r<=R){help[index++]=arr[l]时间复杂度:O(NlogN)
空间复杂度:O(logN)*functionquickSort(arr){if(arr==null||arr.length<=0){return[];}quick(arr,0,arr.length-1);}functionquick(arr,L,R){//递归结束条件是L>=Rif(Lnum){swap(arr,--more,cur);}else{cur++;}}return[less,more];}functionswap(arr,i,j){vartemp=arr[i];arr[i]=arr[j];arr[j]=temp;}6.堆排序堆排序思路:
1.让数组成为一个大根堆
2.将最后一个位置与堆顶交换
3。如果最大值在末尾,则将剩余部分heapify,重新调整前端训练到大根堆,然后将top位置与这部分的last位置交换
4.如此反复直到归约完成,最后调整完成,整个数组排序完毕(升序排列)
时间复杂度:O(NlogN)
空间复杂度:O(1)*functionheapSort(arr){if(arr==null||arr.length<=0){return[];}//首先是建立大顶堆的过程for(vari=0;i0){//返回大顶堆heapify(arr,0,s大小);//交换swap(arr,0,--size);}}//functionheapInsert(arr,index){//比较当前位置和父位置,如果大于父位置,则交换移动索引到其父位置进行循环,否则跳过//结束条件小于父位置或到达根节点while(arr[index]>arr[parseInt((index-1)/2)]){//Exchangeswap(arr,index,parseInt((index-1)/2));index=parseInt((index-1)/2);}}//堆减少过程/**size是指数组前面有多少个数组成一个堆。如果要弹出堆顶,把堆顶和最后一个数交换,size减1,然后从0位置开始heapify,调整一下,剩下的部分就变成Largetopheap*/functionheapify(arr,index,size){varleft=2*index+1;while(leftarr[最大]?索引:最大;//如果最大索引与传入的索引相同,则该值到达指定位置,直接结束循环if(index==largest){break;}//交换改变索引及其左子节点swap(arr,index,largest);指数=最大;left=2*index+1;}}functionswap(arr,i,j){vartemp=arr[i];arr[i]=arr[j];arr[j]=temp;}7.桶排序桶排序会经历三次遍历:准备一个数组,遍历一次数组,重新构造数组,根据比较对错排序,下面做一道题来说明思路
问题:
给定一个数组,求排序后相邻两个数的最大差值。时间复杂度为O(N),无法使用比较排序
思想:
1.准备桶:如果数组中有N个数,准备N+1个桶
2。遍历数组一次,找到最大值max和最小值min。如果min=max,则差值=0;如果min≠max,则最小值放在0号桶,最大值放在N号桶,其余的数属于哪个桶的范围。
3.根据鸽巢原理,一定有一个桶是空的。设计这个桶的目的是为了否定最大值在一个桶中,所以最大差的两个数一定来自两个桶,但是空桶的两侧不一定是最大值
4.所以只记录所有进入桶的最小值min和最大值max以及一个表示桶是否有值的布尔值
5。然后遍历这个数组,如果bucket为空,则跳到下一个数,如果bucket不为空,则找到之前的非空bucket,则最大差=当前bucketmin-之前的非空bucketmax,用全局变量更新最大值
时间复杂度:O(N)
空间复杂度:O(N)functionmaxGap(arr){if(arr==null||arr.length<=0){return0;}varlen=arr.length;varmax=-Infinity,min=Infinity;//遍历数组寻找最大值max和最小值minfor(vari=0;iarr[i]?最大值:arr[i];分钟=分钟>arr[i]?arr[i]:min;}//如果min=max,则差为0;if(min==max){return0;}varhasNum=newArray(len+1);varmins=newArray(len+1);varmaxs=newArray(len+1);varbid=0;//指定桶的编号for(vari=0;i