前端必须知道的七种排序算法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;i
时间复杂度:O(N^2);
空间复杂度:O(1)functionSelectionSort(arr){if(arr==null||arr.length<0){return[];}for(vari=0;i
空间复杂度:O(1)functioninsertSort(arr){if(arr==null||arr.length<=0){return[];}varlen=arr.length;for(vari=1;i
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(logN)*functionquickSort(arr){if(arr==null||arr.length<=0){return[];}quick(arr,0,arr.length-1);}functionquick(arr,L,R){//递归结束条件是L>=Rif(L
1.让数组成为一个大根堆
2.将最后一个位置与堆顶交换
3。如果最大值在末尾,则将剩余部分heapify,重新调整前端训练到大根堆,然后将top位置与这部分的last位置交换
4.如此反复直到归约完成,最后调整完成,整个数组排序完毕(升序排列)
时间复杂度:O(NlogN)
空间复杂度:O(1)*functionheapSort(arr){if(arr==null||arr.length<=0){return[];}//首先是建立大顶堆的过程for(vari=0;i
问题:
给定一个数组,求排序后相邻两个数的最大差值。时间复杂度为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;i
