首页 > 编程知识 正文

九大排序算法再总结,8种排序算法

时间:2023-05-04 22:26:24 阅读:14190 作者:4143

最近,自己总结了js常见的几种排序算法,并进行了简单的测试和比较。 包括气泡排序、插入排序、选择排序、快速排序和合并排序。

1 .冒泡排序:冒泡排序比较简单,从前面的值开始依次比较两个相邻的值,如果前面的值大于后面的值就交换位置,进行一次后最大的值就是最后一个值。 然后,同样地对剩下的n-1、n-2进行排序…个数代码如下。

功能bubble sort (list ) for ) letI=0; i list.length; I ) for(letj=0; j list.length - i; j () if ) list[j]list[j1] ) { let temp=list[j]; list[j]=list[j 1]; 列表[ j1]=temp; } }返回列表; )2)选择排序)选择排序的基本思路,将数组分为左侧有序数组,如[a0,…ai]和右侧无序排序对象列[a[i 1],…an],从无序数组中每次排序最小值代码如下。

功能选择(列表) for ) letI=0; i list.length - 1; I ) for(letj=I1; j list.length; j () if ) list[j]list[I] ) { let temp=list[i]; list[i]=list[j]; list[j]=temp; } }返回列表; 63 )插入排序)插入排序思路也将数组分为有序数组和无序数组两部分,每次从无序数组中取出第一个,在有序数组中比较插入,重复操作直到数列完全有序。 代码如下。

functioninsertsort(list ) for ) letI=1; i list.length; I ) for(letj=I; j 0; j-- } { if (list [ j ] list [ j-1 ] ) { lettemp=list [ j ]; list[j]=list[j - 1]; list[j - 1]=temp; } }返回列表; } 3.快速排序通常可以说是快速排序最有效的排序方法。 快排的基本思想是在数列中找到中间值,把小于中间值的值放在左边,把大于中间值的值放在右边。 左边的任意一个值都在右边的数列以下,然后分别尝试分割左侧和右侧的数列,可以看出整个数列很有序。 代码为以下:

functionquicksort(list ) function quick (list,start,end ) { let lower=start,height=end,key=math.floor ) list[lower]=powkey; while(heightlower ) while ) list[height]=powkeyheightlower ) height----; (if )低高度) { list[lower ]=list[height]; } while (list [ { lower ]=powkeyheightlower ) ) lower; (if ) lowerheight ) { list[height--]=list[lower]; } } list[lower]=powkey; if (开始1 lower ({快速) list,开始,lower - 1 ); }if(lower 1end ) ) quick ) list,lower1,end ); }Quick(list,0,list.length - 1 ); 返回列表; }上的代码是快速通道的整个实现过程。 首先调用内部quick方法,传递数组,指定开始位置和结束位置,然后在方法内部定义高位指针heigh和高位指针lower。

然后设定中间值。 这里取中、之间的值。 通常采用第一个值,但如果数组本身是规则的,则每次划分的两个数列基本上左侧为0,右侧为整个数组。 在这种情况下,快速排序的效率非常高

下降,所以我去中间值,然后同第一个交换位置,再把第一个做为关键值进行比较)。首先从高位比较,如果高位的值大于中间值powkey,则位置不变,如果小于powkey说明应该位于中间值的左侧,这时包这个高位的值放到低位lower,然后lower++ 判断低位的值是否大于powkey,如果大于说明应该位于右侧,然后把该值移动到刚才空余出来的高位height(上面把高位的值移动到低位了),然后再从高位比较重复之前过程直到lower和height重合。重合的位置重新设置为powkey。一次分割完成,判断左右两侧的数组长度是否大于1,大于1继续递归,否则不用分割。

4.归并排序:

归并排序的思维也是对数组进行一分为二分割,不同的是归并排序不是按照关键值进行分割,而是从中间将数组一分为二,然后不断分割形成一颗二叉树,例:[6,5,7,2,5, 9]如图:

6,5,7,2,5,9 6,5,7 2,5,9 6 5,7 5 7 2 5,9 5 9

从二叉树最底层向上有序合并,如,5和7合并为[5,7], 5和9合并[5,9]然后,在向上合并,6 和[5,7]合并为[5,6,7], 2和[5,9]合并为[2,5,9],一直合并到最顶端合并为一个数组。
代码如下:

function mergeSort (list) { function merge (left, right) { let list = []; while (left[0] && right[0]) { if (left[0] < right[0]) { list.push (left.shift ()); } else { list.push (right.shift ()); } } list = list.concat (left).concat (right); return list; } function sort (arr) { if (arr.length === 1) { return arr; } let mid = Math.floor ((arr.length + 1) / 2); return merge (sort (arr.slice (0, mid)), sort (arr.slice (mid))); } return sort (list);}

首先调用内部sort,传入数组,如果长度为1则返回,否则将数组一分为二,递归调用merge,传入的两个参数分别为分别递归调用sort进行拆分,知道长度为1即二叉树最底层,然后进行merge,在merger中分别对两个 数组第一个值进行比较,最小的放入新的数组中,然后返回一个新的有序的数组,即返回二叉树的上一级。在上一级中再次进行数组合并,返回一个新的有序数组,知道合并为同一个。
先写到这里,稍后更新。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。