只討論基於比較的排序
只討論內部排序
穩定性:任意兩個相等的數據,排序前後的相對位置不發生改變
沒有一種排序是任何情況下都表現最好的
時間複雜度下界:
逆序對:對於下標 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個元素!