排序(Sort)是将一组数据按照一定的大小先后顺序进行排列。排序算法是最基本的算法,但是在实际应用场景中档数据量非常庞大的时候往往面临一些困难,因此需要根据具体问题选择最合适的高效的排序算法。
排序算法有很多种,每一种排序算法都各有优劣。常见的包括交换排序,选择排序,插入排序,合并排序,一般这些排序过程都是直接在内存中完成,统称为内排序。而对于一些大的文件,由于内存有限,不能一次性在内存中直接完成,需要将大文件划分为若干部分,然后分别读入排序,经过多次处理完成整个排序过程,这种情况下的排序称为外排序。
下表列举了内排序中常见的一些排序算法,算法的使用场景,复杂度:
类别 | 名称 | 摘要 | 复杂度 | |
内排序 | 交换排序 | 冒泡排序 | 冒泡排序算法比较简单容易理解,若初始状态基本有序(指正序),可以采用冒泡排序,但不适合于规模较大且乱序的场景。 | O(N2) |
鸡尾酒排序 | 冒泡排序的改进算法 | O(N2) | ||
快速排序 | 采用分治的思想,平均排序效率高,在带排序数据量较大时多数情况下采用快速排序能取得较好的效果。 | O(N*log2N) | ||
选择排序 | 选择排序 | 算法简单,容易理解,但是非常慢的,即使是在最好的情况下都需要二次方时间。 | O(N2) | |
堆排序 | 算法效率高,而且在最好、最坏、平均情况下算法效率基本稳定。 | O(N*log2N) | ||
插入排序 | 插入排序 | 不适合对于数据量比较大的排序应用,如果小规模数据需要排序并且初始数据几乎是有序的,插入排序是一个不错的选择。 | O(N2) | |
希尔排序 | 插入排序的改进算法。 | O(N3/2) | ||
合并排序 | 归并排序 | 采用了分治的思想,将两个(或以上)有序表合并成一个新的有序表,算法高效,但需要额外存储空间开销。 | O(N*log2N) | |
其他 | 计数排序 桶排序 | 适用于排序规模较大,数据比较集中 适用于排序规模较大,数据比较集中,分布均匀 | O(N) | |
… | … | |||
外排序 | … | … | … | … |