简介
排序算法是根据元素的对应的比较运算符重新排列给定的数组的算法,输出的数组是一个根据比较符从小到大或者从大到小依次排列的数组。比较运算符是用于确定相应数据结构中元素的新顺序,比如在整数数组里面,对应的比较符号就是大于或者小于号,用户也可以自己定义对应的比较运算符。
比如如果输入是[5,4,2,3,1]
,按照从小到大输出,结果应该是[1,2,3,4,5]
。
特性
-
稳定性
如果在数组中有两个元素是相等的,在经过某个排序算法之后,原来在前面的的那个元素仍然在另一个元素的前面,那么我们就说这个排序算法是稳定的。如果在排序之后,原来的两个相等元素中在前面的一个元素被移到了后面,那么这个算法就是不稳定的。
比如排序之前数组为
[3(a),2,3(b)]
(其中a和b分别代表两个不同的3),经过某个排序算法之后是[2,3(a),3(b)]
,那么这个算法就是稳定的;如果变成了[2,3(b),3(a)]
,那么这个算法是不稳定的。 -
时间复杂度
时间复杂度反映了算法的排序效率,通常用大O表示法来表示,通常暗示这个算法需要的最多操作次数的量级,比如O(n)表示最多需要进行n量级操作。 -
空间复杂度
空间复杂度反映了算法需要消耗的空间,比如*O(1)*表示只需要常数量级的空间,不会随着数组大小的变化而变化。如果一个排序算法不需要额外的存储空间,可以直接在原来的数组完成排序操作,这个算法可以被称之为原地算法,空间复杂度是O(1)。
-
比较排序和非比较排序
如果一个算法需要在排序的过程中使用比较操作来判断两个元素的大小关系,那么这个排序算法就是比较排序,大部分排序算法都是比较排序,比如冒泡排序、插入排序、堆排序等等,这种排序算法的平均时间复杂度最快也只能是O(nlogn)。非比较排序比较典型的有计数排序、桶排序和基数排序,这类排序能够脱离比较排序时间复杂度的束缚,达到*O(n)*级别的效率。