【資料結構與演算法】內部排序總結(附各種排序演算法原始碼)

蘭亭風雨發表於2014-03-11

轉載請註明出處:http://blog.csdn.net/ns_code/article/details/20540069


內部排序總結

    這篇博文我們簡要地總結下各種內部排序方法。
    這10種排序演算法中,前面7種屬於建立在“比較”基礎上的排序演算法,通過決策樹已經證明,任何基於比較進行的排序演算法的時 間複雜度不可能再優於O(n*logn)。後面3種不是建立在比較的基礎上的,因此,可以達到線性執行時間。
    下面我們給出各種排序方法的時空複雜度的表格(屬於自己總結,有不對的地方,希望大家指正或補充)。

排序方法

最好時間複雜度

平均時間複雜度

最壞時間複雜度

空間複雜度

是否穩定

氣泡排序

O(n)

O(n*n)

O(n*n)

O(1)

穩定

插入排序

O(n)

O(n*n)

O(n*n)

O(1)

穩定

選擇排序

O(n*n)

O(n*n)

O(n*n)

O(1)

不穩定

希爾排序

O(n)

不定

O(n*n)

O(1)

不穩定

堆排序

O(n*logn)

O(n*logn)

O(n*logn)

O(1)

不穩定

歸併排序

O(n*logn)

O(n*logn)

O(n*logn)

O(n)

穩定

快速排序

O(n*logn)

O(n*logn)

O(n*n)

O(logn)

不穩定

計數排序

O(n+k)

O(n+k)

O(n+k)

O(k)

穩定

基數排序

O(d(n+k))

O(d(n+k))

O(d(n+k))

O(k)

穩定

桶排序

O(n)

O(n)

O(n)

不定

取決於桶內

    關於各種排序,給出如下幾點總結:
  • 後面3種排序效率極高,且只有在一些特定條件下才可以使用,而且需要額外的輔助空間,如果d或k很大,其效能對於主存排序來說就不太好了,計數排序和基數排序最適合於n很大,而k和d很小的情況。
  • 在基於比較的排序方法中,就平均效能而言,快速排序最佳。
  • 對於最一般的內部排序應用程式,選用的方法一般不是插入排序、希爾排序就是快速排序。
  • 歸併排序一般只用在小的或非常接近排好序的輸入資料上,因為需要O(n)的輔助空間,因此其效能對於主存排序不如快速排序那麼好,但是合併時外部排序的中心思想。
  • 堆排序要比希爾排序慢,儘管它是一個帶有明顯緊湊內迴圈的O(n*logn)演算法。
  • 效能比較好的幾種基於比較的內部排序中,只有歸併排序是穩定的,快速排序、堆排序和希爾排序都不穩定,而其他簡單的排序演算法基本都是穩定的,選擇排序除外。一般來說,對於基於比較的排序方法,如果比較是在相鄰兩個元素之間進行的,則該排序是穩定的。


原始碼打包下載

    原始碼包括:氣泡排序、選擇排序、插入排序、希爾排序、堆排序、歸併排序、快速排序、計數排序、基數排序等,沒有實現桶排序。

    完整原始碼打包下載地址:http://download.csdn.net/detail/mmc_maodun/6995321





相關文章