一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
前言
我们前面介绍了那么多的排序算法,包括快速排序,归并排序,冒泡排序等等,其实在我们日常的业务逻辑开发中,都会使用现成的排序的函数库来进行数据的排序的,比如Java语言中就是使用Collections.sort()。那么今天我们就来探究排序算法的实现以及他们如何高性能的执行的。
排序算法编写
在前一篇文章中介绍的桶排序,时间复杂度比较低,但是有诸多的限制条件,只适合在特定的场景下,那么我们如何写一个通用的排序算法呢。首先,我们可以根据数据量的规模来进行算法的选择。如果数据量的规模比较小,那么我们选择时间复杂度为是 O(n2) 的算法,那么如果数据量的规模比较大的话,我们可以选择时间复杂度O(nlogn) 的算法。但是为了兼容任意规模的数据量的排序,第一首选肯定是时间复杂度为O(nlogn) 的排序算法来实现排序函数。时间复杂度为O(nlogn)的排序算法有很多个,Java 语言采用堆排序实现排序函数,C 语言使用快速排序实现排序函数。为什么归并排序的情况不多的,这是因为有一个非常重要的因素限制着,归并排序并不是原地排序算法,空间复杂度是O(n),简单一点来说。就是要排序200MB的数据,除了数据自身占用的内存外,排序算法还需要额外的200MB空间。这样就会导致空间消耗翻倍的。所以采用快速排序的方式来实现一个通用的排序比较好的。
总结
虽然很多变成语言都提供了现成的,并且性能优越的排序函数实现方法,但是作为开发者去了解其中的原理是非常的有必要的。