【數據結構】排序----簡單排序(冒泡/插入)

只討論基於比較的排序

只討論內部排序

穩定性:任意兩個相等的數據,排序前後的相對位置不發生改變

沒有一種排序是任何情況下都表現最好的

時間複雜度下界:

逆序對:對於下標 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

 

 

 

 

 

 

 

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