只讨论基于比较的排序
只讨论内部排序
稳定性:任意两个相等的数据,排序前后的相对位置不发生改变
没有一种排序是任何情况下都表现最好的
时间复杂度下界:
逆序对:对于下标 i < j ,如果 A[ i ] > A[ j ] ,则称 ( i , j ) 是一对逆序对(inversion)
冒泡排序:
比较相邻的两个元素,将大的放在右边,感觉就像泡泡上浮。
一趟排序,大的肯定在右边,下次重复N-1 个数就行
时间复杂度:
最好情况 ,整个序列一开始就是顺序的 T =O(N)
最坏情况,整个序列都是逆序的 T =O(N²)
好处:1.很简单就两个for 循环 2.排序算法是稳定 3.
坏处:N² 是不可接受的
插入排序:
可以理解为打牌,
摸
第一张为 J
第二张为 K K比J大,放在J 的后面 : J K
第三张 为 A A跟K 比, 比K大 放K后面 : J K A
然后摸到 Q,跟A比,发现比A小放A左边,A往后移一位,再跟K比,发现比K小,放K左边,K往后移一位
再给J比,比J比 大,放J后面 :J Q K A
最坏情况:第四张来个10 , 我JQKA 全部向后移1位,最前面的位置给10
时间复杂度:
最好情况 ,整个序列一开始就是顺序的 T =O(N)
最坏情况,整个序列都是逆序的 T =O(N²)
只有在两个牌大小不一致才移动,说明此算法是稳定的
时间复杂度下界
问题:序列{34, 8, 64, 51, 32, 21}中有多少逆序对? 9对
(34, 8) (34, 32) (34, 21) (64, 51) (64, 32) (64, 21) (51, 32) (51, 21) (32, 21)
交换2个相邻元素正好消去1个逆序对!!!!
插入排序: T(N, I) = O( N+I ) I 代表原始序列的逆序对相关 N代表序列里的个数
I足够小, 插入排序简单高效换言之
如果序列基本有序,则插入排序简单且高效
- 定理:任意N个不同元素组成的序列平均具有 N ( N - 1 ) / 4 个逆序对。
- 定理:任何仅以交换相邻两元素来排序的算法,其平均时间复杂度为 Ω(N²)。
这意味着:要提高算法效率,我们必须
每次消去不止1个逆序对! 每次交换相隔较远的2个元素!