排序算法:综述 & 简单排序

一、分类

常用的排序有:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序等。

前三个理解起来相对简单,分类为简单排序。基于元素比较进行,时间复杂度都为O(n²)。

中间两个,归并 & 快排,复杂一些,但思路比较统一。基于元素比较进行,时间复杂度都为O(n log n)。

后面三个解决问题的思路特殊,并非基于比较进行,对数据有一定要求,但时间复杂度可以做到O(n)。

二、如何考量一个排序算法的好坏

2.1 时间复杂度

时间复杂度也要区分最好情况、最坏情况、平均情况的时复杂度。

2.2 空间复杂度(内存消耗)

如果无需额外空间,及空间复杂度为O(1),也称为原地排序。

2.3 稳定性

即值相同的元素在排序前后的顺序性是否保持一致的描述,如果保持一致,则称为稳定排序,反之为非稳定排序。

三、简单排序

3.1 冒泡排序

每进行一轮冒泡,保证将最大的元素冒到未排序序列的最后面。即第n轮冒泡后,序列的后n个值的序列变为有序。

3.2 插入排序

序列分为有序部分和无序部分,每次选择无序序列的第一个与依次与有序序列的值进行比较,插入到正确的位置。

3.3 选择排序

序列分为有序部分和无序部分,每次找到无需序列中的最小值,放到有序序列的末尾加入有序序列。

四、简单排序的对比

排序算法 平均时间复杂度 空间复杂度 是否稳定
冒泡排序 O(n²) O(1)
插入排序 O(n²) O(1)
选择排序 O(n²) O(1)

可以看到三种排序的平均时间复杂度都是O(n²),空间复杂度都是O(1),即都是原地排序。

但冒泡和插入都是稳定的,选择排序是非稳定的。这点可以从它们的实现策略上分析出来,冒泡和插入都是数据依次对比,我们可以决定相等时的策略(交换or不交换、插入在前or插入在后)。而选择排序的跨位置交换,可能造成原序列中相等元素的相对位置改变。