引用文章A:http://blog.csdn.net/whuslei/article/details/6442755git
引用介紹:介紹了排序的複雜度(time and space) 以及穩定性。github
算法會在2015/3/1更新至GITHUB。Addr:https://github.com/zheng39562/arithmetic算法
2015/3/1版:暫定爲int排序。目標爲泛型算法。數組
本文僅介紹我的在其中碰見的問題。若是對算法並不瞭解/遺忘。能夠閱讀引用文章。也歡迎對更多的看法:)函數
基本概念:優化
1)時間複雜度:一般分爲最好和最壞狀況。但一般而言基本會考慮最壞狀況。由於最好狀況基本都會有必定的先決條件,做爲通用算法。必須按照最壞狀況計算。spa
1,但在針對性領域,在肯定前提狀況下,可使用最好狀況來編寫代碼(但必須有絕對把握).net
2)空間複雜度:須要的輔助空間量。指針
1,犧牲時間,仍是犧牲空間。並無絕對的答案。徹底看本身的狀況而定。blog
3)穩定性:通俗的理解即,兩個在比較條件中相等的元素,在屢次排序中不改變順序。(具體見引用A)
1)對於穩定性,我的理解,就是把全部元素都看成不一樣元素時(包括相等元素),排序結果依然只有一種。
2)引用A中的一個猜想:若存在兩個不相鄰元素的交換,則多是不穩定的。
1:冒泡算法。時間複雜度最壞/最好/平均:O(n2),O(n),未知。穩定性;穩定。
1,冒泡排序大概是最容易懂的排序了吧。
2:插入算法:時間複雜度最壞/最好/平均:O(n2),O(n),O(n2)。穩定性;穩定。
1,插入排序須要移動數組元素。因此,建議:從後往前進行比較。這並不必定會提升移動速度,但能夠不須要單獨作一個移動函數(從前日後,可能須要一次性移動多個元素,從後往前,則能夠在判斷時直接進行鄰近交換)。
2,插入排序中若是不該用其餘優化。是一個比較坑爹的排序。(老是不自覺的想在其中加入其餘排序算法)
3:希爾排序:時間複雜度最壞/最好/平均:O(nlogn),未知,O(nlogn)。穩定性;不穩定。
1,沒法理解爲什麼其時間複雜度爲O(nlogn)。
2,相似與二分法來解決插入排序。
4:快速排序:時間複雜度最壞/最好/平均:O(nlogn),未知,O(nlogn)。穩定性;不穩定。
1,while( array[i--] ... ) // 須要注意,不管循環是否執行,i都退出循環時,都會比指望的少1。若是使用此方式循環而且在後續還要繼續使用 i 這個值,則須要慎重思考。
5:選擇排序:時間複雜度最壞/最好/平均:O(n2),O(n2),O(n2)。穩定性;不穩定。
1,表示實現不想寫這個代碼。但願我這輩子都不會用到。。。
6:堆排序:時間複雜度最壞/最好/平均:O(nlogn),未知,O(nlogn)。穩定性;不穩定。
1,寫成了heap類。當使用鏈表構建時,須要注意末尾指針的移動。
7:並歸排序:時間複雜度最壞/最好/平均:O(nlogn),o(nlogn),O(nlogn)。穩定性;穩定。空間複雜度:O(n)
1,這是少數幾種須要佔用輔助內存的常規排序方法。但,它是時間複雜度nlogn中的惟一穩定的排序方式。當對於元素位置有強烈要求時,推薦此排序方式。
8:基數排序:按位比較排序。先按照個位,再按照十位,依次類推。
1,要求:最高位數。而且只有針對數字,或能夠有類推規律的數據。
2,其時間複雜度僅爲o(n)。若是對時間要求略高,但同時符合要求,能夠考慮此方式。