排序(Sort)是將一組數據按照一定的大小先後順序進行排列。排序算法是最基本的算法,但是在實際應用場景中檔數據量非常龐大的時候往往面臨一些困難,因此需要根據具體問題選擇最合適的高效的排序算法。
排序算法有很多種,每一種排序算法都各有優劣。常見的包括交換排序,選擇排序,插入排序,合併排序,一般這些排序過程都是直接在內存中完成,統稱爲內排序。而對於一些大的文件,由於內存有限,不能一次性在內存中直接完成,需要將大文件劃分爲若干部分,然後分別讀入排序,經過多次處理完成整個排序過程,這種情況下的排序稱爲外排序。
下表列舉了內排序中常見的一些排序算法,算法的使用場景,複雜度:
類別 |
名稱 |
摘要 |
複雜度 |
|
內排序 | 交換排序 | 冒泡排序 | 冒泡排序算法比較簡單容易理解,若初始狀態基本有序(指正序),可以採用冒泡排序,但不適合於規模較大且亂序的場景。 | O(N2) |
雞尾酒排序 | 冒泡排序的改進算法 | O(N2) | ||
快速排序 | 採用分治的思想,平均排序效率高,在帶排序數據量較大時多數情況下采用快速排序能取得較好的效果。 | O(N*log2N) | ||
選擇排序 | 選擇排序 | 算法簡單,容易理解,但是非常慢的,即使是在最好的情況下都需要二次方時間。 | O(N2) | |
堆排序 | 算法效率高,而且在最好、最壞、平均情況下算法效率基本穩定。 | O(N*log2N) | ||
插入排序 | 插入排序 | 不適合對於數據量比較大的排序應用,如果小規模數據需要排序並且初始數據幾乎是有序的,插入排序是一個不錯的選擇。 | O(N2) | |
希爾排序 | 插入排序的改進算法。 | O(N3/2) | ||
合併排序 | 歸併排序 | 採用了分治的思想,將兩個(或以上)有序表合併成一個新的有序表,算法高效,但需要額外存儲空間開銷。 | O(N*log2N) | |
其他 | 計數排序 桶排序 |
適用於排序規模較大,數據比較集中 適用於排序規模較大,數據比較集中,分佈均勻 |
O(N) | |
… | … | |||
外排序 | … | … | … | … |