八大排序算法的時間、空間復雜度和穩定性
❀八大排序算法對應的文章:
《八大排序算法之直接插入排序(教你用生活的想象,讀懂插入算法) 》
《八大排序算法~快速排序 》
《八大排序算法~堆排序 》
一,各個算法的情況與分析:
時間復雜度~一般咱就考慮平均情況就行,除非要求對時間特別苛刻才考最差情況~八大算法里就那個希爾排序跟快排時間復雜度最壞跟平均不同
1、直接插入排序 的時間和空間效率:
✪ 時間復雜度:O(n2),空間復雜度:O(1); ~因為在空間上沒有利用什么輔助空間~穩定
2、希爾排序 的時間跟空間效率:
✪ 時間復雜度:大約O(n1.3),空間復雜度:O(1); ~因為在空間上沒有利用什么輔助空間~不穩定
不穩定的原因~假設有兩個相同的數字在兩個不同的子序列里邊,如果每個子序列把小數扔前大數扔后,可能導致兩個位置發生先后改變。
✿ 希爾排序注意點:不宜在鏈式結構上進行實現~因為分割的間隔d的值導致每個子序列的元素之間出現間隔,使用數組有下標可以快速找到哈!
3、冒泡排序 的時間跟空間效率:
✪ 時間復雜度:O(n2),空間復雜度:O(1); ~因為在空間上沒有利用什么輔助空間~穩定
4、快速排序 的時間跟空間效率:
✪ 時間復雜度:O(nlog2n),空間復雜度:O(log2n); ~ ~不穩定
■為什么時間是O(nlog2n)呢? ---遞歸算法耗費時間:O(log2n)
---其余數跟中心點進行比較耗費時間: O(n)
■為什么空間是O(log2n)呢?----快速排序不是原地排序---遞歸需要用到棧,而棧的長度取決於調用的深度,平均情況是 O(log2n),最差情況是O(n)。
不穩定的原因~假設有兩個相同的數字,取第一個數為中心點,當比較后會出現low=high的那個位置,導致第一個數放到low=high位置上導致兩個數前后順序發生改變。
5、簡單(直接)選擇排序 的時間跟空間效率:
✪ 時間復雜度:O(n2),空間復雜度:O(1); ~因為在空間上沒有利用什么輔助空間~不穩定。
不穩定的原因~直接選擇排序~擂台法【找小,從小到大排序】,假設有兩個相同的數字,當第一個數比擂台上的數還小,則替換掉擂台上的數,然后在第二個數的后邊又出現了其他比擂台的數替換掉擂台上的數,導致兩個數前后順序發生改變。
6、堆排序 的時間跟空間效率:
✪ 時間復雜度:O(nlog2n),空間復雜度:O(1); ~~因為在空間上沒有利用什么輔助空間~不穩定
■為什么時間是O(nlog2n)呢? ---遞歸算法耗費時間:O(log2n)
---最后一個元素放到根結點后,其余元素位置需要遍歷調整: O(n)。
不穩定的原因~調成成大根堆(或小根堆)時數據的調整導致相同的兩個數據先后位置發生改變。
✿ 堆排序注意點:不適合待排記錄個數較少的情況,對於n較大的文件還是很有效的。
7、歸並排序 的時間跟空間效率:
✪ 時間復雜度:O(nlog2n),空間復雜度:O(n); ~~穩定
■為什么時間是O(nlog2n)呢? ---遞歸算法耗費時間:O(log2n)趟
---所有元素都需要進行歸並,每一趟都要合並n個元素: O(n)
8,基數排序(也叫桶排序)的時間跟空間效率:
✪ 時間復雜度:O(k*(n + m)),空間復雜度:O(n+m); ~穩定
●為什么時間是O(k*(n + m))呢?
■ k 是關鍵字的位數的個數,例如待排數據中的最大一個數有三位數(個十百),則k=3;
■ n 是要分配n個數,m是要收集的m個數(m就是桶數,從桶中收集數據);
●為什么空間是O(n + m)呢?
■ 輔助空間是有m個桶,每個桶的深度是n;
二,總結八大算法的時間、空間效率、穩定性:
引自:《數據結構c語言版嚴蔚敏PPT.pdf ~
https://wenku.baidu.com/view/9e73cb8b69dc5022aaea00c1.html》
三,使用建議:
3-1,按時間性能考慮(平均時間性能):
■ 時間復雜度O(nlog2n):快排、堆排、歸並~特點都用到了遞歸~快排最優
■ 時間復雜度O(n):桶排
■ 時間復雜度O(n2):冒泡、直接選擇、直接插入~特點外層循環進行趟數,內循環比較個數~直接插入最優
✿ 注意:當待排記錄序列按關鍵字順序有序時,直接插入和冒泡排序都能到到的時間復雜度為O(n);而此時對快排是最不好的情況,導致其時間復雜度退化為O(n2);
3-2,按空間性能(輔助空間)考慮:
■ 空間復雜度O(1):冒泡、簡單選擇、直接插入、希爾、堆排~特點是就地排序
■ 空間復雜度O(log2n):快排~因為棧所需輔助空間
■ 空間復雜度O(n):歸並、桶排
3-3,按穩定性考慮(穩定性~兩個相同的數據因排序導致原先的先后順序發生改變):
■ 八大排序不穩定算法: 希爾、直接選擇、快排、堆排
■ 其中最不穩定算法:快排、堆排