1.插入排序:每次將一個待排的記錄插入到前面的已經排好的隊列中的適當位置。
①.直接插入排序
直接排序法在最好情況下(待排序列已按關鍵碼有序),每趟排序只需作1次比較而不需要移動元素。所以n個元素比較次數爲n-1,移動次數0。
最差的情況下(逆序),其中第i個元素必須和前面的元素進行比較i次,移動個數i+1,所以總共的比較次數 比較多,就不寫出來了
總結:是一種穩定的排序方法,時間複雜度O(n^2),排序過程中只要一個輔助空間,所以空間複雜度O(1)
②.希爾排序
縮小增量排序,對直接插入排序的一種改進
分組插入方法。
總結:是一種不穩定的排序方法,時間複雜度O(n^1.25),空間複雜度O(1)
2.交換排序
①.冒泡排序
最好的情況下,就是正序,所以只要比較一次就行了,複雜度O(n)
最壞的情況下,就是逆序,要比較n^2次才行,複雜度O(n^2)
總結:穩定的排序方法,時間複雜度O(n^2),空間複雜度O(1),當待排序列有序時,效果比較好。
②.快速排序
通過一趟排序將待排的記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一個部分的關鍵字小,然後再分別對這兩個部分記錄繼續進行排序,以達到整個序列有效。
總結:在所有同數量級O(nlogn)的排序方法中,快速排序是性能最好的一種方法,在待排序列無序時最好。算法的時間複雜度是O(nlogn),最壞的時間複雜度O(n^2),空間複雜度O(nlogn)
3.選擇排序
①.直接選擇排序
和序列的初始狀態無關
總結:時間複雜度O(n^2),無論最好還是最壞
②.堆排序
直接選擇排序的改進
總結:時間複雜度O(nlogn),無論在最好還是最壞情況下都是O(nlogn)
4.歸併排序
總結:時間複雜度O(nlogn),空間複雜度O(n)
5.基數排序
按組成關鍵字的各個數位的值進行排序,是分配排序的一種。不需要進行排碼值間的比較就能夠進行排序。
總結:時間複雜度O(d(n+rd))
總總結:
n比較小的時候,適合 插入排序和選擇排序
基本有序的時候,適合 直接插入排序和冒泡排序
n很大但是關鍵字的位數較少時,適合 鏈式基數排序
n很大的時候,適合 快速排序 堆排序 歸併排序
無序的時候,適合 快速排序
穩定的排序:冒泡排序 插入排序 歸併排序 基數排序
複雜度是O(nlogn):快速排序 堆排序 歸併排序
輔助空間(大 次大):歸併排序 快速排序
好壞情況一樣:簡單選擇(n^2),堆排序(nlogn),歸併排序(nlogn)
最好是O(n)的:插入排序 冒泡排序