排序算法的我的心得體會。

引用文章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)。若是對時間要求略高,但同時符合要求,能夠考慮此方式。

相關文章
相關標籤/搜索