常見排序算法(交換排序-曾經的筆記)

二、交換排序

        交換排序的基本思想就是兩兩比較待排序的關鍵碼,如果遇到逆序(與目標順序正好相反) 時,就進行交換,直到所有對象都排好序爲止。常見的交換排序有:起泡排序和快速排序。

   

1.起泡排序

    思想:從前往後,將第一記錄與緊接其後的記錄進行比較,若爲逆序,則交換,然後比較第二個記錄與第三個記錄比較,逆序則交換,依此類推直到最後。然後再從第一個到倒數第二個記錄,重複以上操作,直到只剩下第一個記錄爲此。總之,當遞增排序時,可以這樣處理:每次比較相鄰的兩個元素,大者向下移動,小者向上移動,每一趟起泡至少有一個記錄排好序。

 

 

【效率分析】

        空間效率:僅用了一個輔助單元。

時間效率:總共要進行n-1趟冒泡,對j個記錄的表進行一趟冒泡需要j-1次關鍵碼比較。


        移動次數:

       最好情況下:待排序列已有序,不需移動。

 

2.快速排序

        思想:以某個記錄爲界(該記錄稱爲支點)通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄進行同樣的分割繼續排序,直到不能再分割,直到整個序列有序爲止。

       效率分析

            空間效率:快速排序是遞歸的,每層遞歸調用時的指針和參數均要用棧來存放,遞歸調用層次數爲(log2n)。因而,存儲開銷在理想情況下爲O(log2n);在最壞情況下,即遞歸二叉樹是一個單鏈,爲O(n)

            時間效率:在n個記錄的待排序列中,一次劃分需要約n次關鍵碼比較,時效爲O(n),若設T(n)爲對n個記錄的待排序列進行快速排序所需時間。

        理想情況下:每次劃分,正好將分成兩個等長的子序列,則

        T(n)cn+2T(n/2)                 c是一個常數

            cn+2(cn/2+2T(n/4))=2cn+4T(n/4)

            2cn+4(cn/4+T(n/8))=3cn+8T(n/8)

           ······

            cnlog2n+nT(1)=O(nlog2n)

        最壞情況下:即每次劃分,只得到一個子序列,時效爲O(n2)

快速排序是通常被認爲在同數量級(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按關鍵碼有序或基本有序時,快排序反而蛻化爲冒泡排序。爲改進之,通常以“三者取中法”來選取支點記錄,即將排序區間的兩個端點與中點三個記錄關鍵碼居中的調整爲支點記錄。快速排序是一個不穩定的排序方法。

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