当前位置: 首页 > 科技观察

面试官:说说常见的排序算法有哪些?区别?_0

时间:2023-03-21 23:13:27 科技观察

本文转载自微信公众号《JS每日一问》,作者慧慧。转载本文请联系JS每日一问公众号。1、什么是排序?是程序开发中很常见的操作。一组任意数据元素排序后,可以变成一组按一定规则排序的有序序列。排序算法就是其中一种算法。而且,它是一种覆盖范围极小的类型。彻底掌握排序算法,对程序开发有很大帮助。排序算法好坏的衡量主要是从时间复杂度、空间复杂度、稳定性时间复杂度、空间复杂度前面讲过,这里我们主要看一下稳定性的定义。稳定性是指假设待排序的记录序列中存在多个具有相同关键字的记录。排序后,这些记录的相对顺序保持不变意味着在原始序列中,r[i]=r[j],并且r[i]在r[j]之前,而在排序后的序列中,r[i]还在r[j]之前,那么这种排序算法称为稳定的;否则称为不稳定。二、常见的算法有哪些?它反复访问待排序的数组,一次比较两个元素,如果顺序错误则交换它们。思路如下:比较相邻的元素,如果第一个大于第二个,则交换它们对每一对相邻的元素做同样的事情,从开始的第一对到最后的最后一对,使得末尾的元素应该是最大的数对除最后一个以外的所有元素重复上述步骤,直到不需要比较任何一串数字为止。选择排序是一种简单直观的排序算法,也是一种交换排序算法。不管输入什么数据,时间复杂度都是O(n2)。所以在使用的时候,数据量越小越好。唯一的优点是不占用额外的内存存储空间。继续在排序元素中寻找最小(最大)的元素,然后将其放在排序序列的末尾。重复第二步,直到所有元素都排序完毕。插入排序是一种简单直观的排序算法。它通过构建有序序列来工作。对于未排序的数据,按照排序后的顺序从后往前扫描。找到对应位置插入解决方法如下:将待排序数组分为已排序和未排序部分。最初认为第一个元素已排序,从第二个元素开始,排序后在子数组中找到该元素的合适位置并插入(如果要插入的元素等于有序数组中的一个元素sequence,inserttheelementbehindtheequalelement.)重复上述过程,直到最后一个元素被插入到一个有序的子数组中归并排序归并排序是一种基于归并操作的有效排序算法。该算法是分治法的一个非常典型的应用。合并排序后的子数组,得到一个完整的有序序列,即先让每个子序列有序,再让子序列段有序。设置两个指针,初始位置分别为两个排序序列的起始位置比较两个指针指向的元素,选择比较小的元素放入合并空间,将指针移动到下一个位置重复步骤3until当指针到达序列的末尾时,将另一个序列的所有剩余元素直接复制到合并序列的末尾。快速排序快速排序是对冒泡排序算法的改进。基本思路是将待排序的数据分成独立的两部分,一部分中的所有数据都小于另一部分中的所有数据,然后通过这种方式快速对两部分数据进行排序,整个排序过程可以是递归的,使整个数据成为一个有序的序列。解决方法如下:从数组中选取一个元素,称为“枢轴”(pivot)对数组重新排序,所有小于枢轴值的元素放在枢轴前面,所有大于枢轴值的元素放在后面枢轴(相同的数字可以到任一侧)。本次划分结束后,基准处于序列的中间。这种称为分区(partition)的操作递归地对小于参考值的元素的子序列和大于参考值的元素的子序列进行排序。Err排序,堆排序等等……区别如下图:参考https://www.runoob.com/w3cnote/bubble-sort.htmlhttp://www.x-lab.info/post/排序算法/https://zhuanlan.zhihu.com/p/42586566