【数据结构】排序----简单排序(冒泡/插入)

只讨论基于比较的排序

只讨论内部排序

稳定性:任意两个相等的数据,排序前后的相对位置不发生改变

没有一种排序是任何情况下都表现最好的

时间复杂度下界:

逆序对:对于下标 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个元素!

bubblesort.py

insertion_sort.py

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章