排序知识总结

来源:互联网 发布:js获取img标签的src 编辑:程序博客网 时间:2024/03/29 04:57

排序是一个比较基础的问题,在各大公司的面试过程中,被问到的可能性非常大。网上也有很多关于各种排序算法的思想及代码的博文,这里我就不再纠结这些内容。这篇文章主要结合《Java面试宝典》中关于排序部分的内容,从宏观上对目前常用的排序算法进行总结,从算法的特点,如时间复杂度,空间复杂度及稳定性等来进行阐述。

常用的排序算法

排序算法有很多,我们需要对其按照某种标准进行分类,这样才能有计划的进行学习,学习的效率和学习的深度都能得到提升。一般来说,排序算法可以按照以下两种标准进行分类:按是否涉及数据的内、外存交换划分和按策略划分。接下来,我就分别介绍一下这两种分类。

按是否涉及数据的内、外存交换分

在排序过程中,,若整个文件都放在内存中处理,排序时不涉及数据的内、外存交换,则称为内部排序;反之,要进行内、外数据交换的就称为外部排序。这两种排序的使用场景不同:
1. 内部排序适用于记录个数不是很多的小文件;
2. 外部排序适用于记录个数太多、不能一次将其全部记录放入内存的大文件;

按策略划分

按策略划分,可以分为五类:插入排序、选择排序、交换排序、归并排序和分配排序。
大多数排序算法基本上都有两个基本的操作:1.比较两个关键字的大小;2.改变指向记录的指针或移动记录本身,其中第二种基本操作的实现依赖于待排序记录的存储方式。

排序的稳定性

当待排序记录的关键字均不相同时,排序结果是唯一的,否则排序的结果不唯一。在待排序文件中,若存在多个相同的关键字记录,经过排序后,这些具有相同关键字的记录之间的相对次序保持不变,该排序方法就是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。

  • 稳定的排序算法及其时间、空间复杂度如下所示:

  • 不稳定的排序算法及其时间、空间复杂度如下所示:

排序算法的性能评价

评价算法好坏的标准主要有两条:执行时间和所需的辅助空间;算法本身的复杂程度。若排序算法所需的辅助空间并不依赖于问题的规模,即辅助空间是O(1),则称之为就地排序。非就地排序压球的辅助空间一般为O(n)。大多数排序算法的时间开销主要是关键字之间的比较和记录的移动。

不同情况下排序算法的选择

  1. 若规模较小(如n小于等于50),可采用直接插入或直接选择排序
  2. 若文件初始状态基本有序(正序),则应该选用直接插入、冒泡或快速排序
  3. 若n较大,则应采用时间复杂度为O(n log n)的排序方法,如快速排序、堆排序或归并排序。

快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布的时,快速排序的平均时间最短。堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。

总结

经过以上内容的学习,我对常用的排序算法从整体上有了更深的认识,我们写代码的过程中就可以根据不同的场景选择适合该场景的排序算法。此外,这些知识也能对求职过程中的笔试和面试有帮助。

0 0
原创粉丝点击