談談這些排序

數據結構很重要,排序是其大頭菜,今天我就來談一下排序吧,參考文獻有www.nowcoder.com/discuss/200097,《數據結構C++語言描述》以及《大話數據結構》,廢話不多說。注意,在排序問題中通常將數據元素稱爲記錄,另外注意一下什麼是排序的穩定性。

0、內排序與外排序

 

根據排序過程中藉助的主要操作, 我們把內排序分爲:插入排序、交換排序、選擇排序和歸併排序

1、交換排序

這是最簡單的排序實現,其基本思想是讓每一個關鍵字都和它後面的每一個關鍵詞一次比較,如果是反序則交換。

這種排序方法,每一輪排序過後對剩餘的關鍵字排序沒什麼幫助。因此效率非常低。

2、冒泡排序 

冒泡排序也是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果是反序則交換,直到沒有反序的記錄爲止。

 圖中經過一輪循環後,不僅僅把最小的冒泡到首位,還把次小的冒泡到前面。接下來分析一下複雜度。


冒泡排序不管序列是怎樣,都是要比較n(n-1)/2 次的,最好、最壞、平均時間複雜度都爲O(n²),需要一個臨時變量用來交換數組內數據位置,所以空間複雜度爲O(1)。有很多人說冒泡排序的最優的時間複雜度爲O(n),其實這是在代碼中使用一個標誌位來判斷是否已經排序好的,是冒泡排序的優化版,如果元素已經排序好,那麼循環一次就直接退出。

3、簡單選擇排序

冒泡排序的思想就是不斷地交換,這和做股票短線頻繁操作的人是類似的。選擇排序的基本思想是每一趟在n-i+1個記錄數據中選取關鍵字最小的記錄作爲有序序列的第i個記錄,比起交換排序,只是少了交換的操作。

選擇排序是冒泡排序的改進,同樣選擇排序無論序列是怎樣的都是要比較n(n-1)/2次的,最好、最壞、平均時間複雜度也都爲O(n²),需要一個臨時變量用來交換數組內數據位置,所以空間複雜度爲O(1)。

4、直接插入排序

其基本思想像極了理牌的時候

其基本操作是將一個記錄插入到已經排好序的有序表中。基本思想是判斷每一個記錄,如果你比前面一個大,OK,不管你了,操作下一個元素;如果你比前面一個小,我得把你插入到合適的位置了。具體做法是將大於該值的所有元素都後移一位。該元素插入到合適位置。


如果序列是完全有序的,插入排序只要比較n次,無需移動時間複雜度爲O(n),如果序列是逆序的,插入排序要比較O(n²)和移動O(n²) ,所以平均複雜度爲O(n²),最好爲O(n),最壞爲O(n²),排序過程中只要一個輔助空間,所以空間複雜度O(1)。 

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