十大經典排序算法

0.1 排序的定義

對一序列對象根據某個關鍵字進行排序。算法

0.2 術語說明

  • 穩定:若是a本來在b前面,而a=b,排序以後a仍然在b的前面;數組

  • 不穩定:若是a本來在b的前面,而a=b,排序以後a可能會出如今b的後面;app

  • 內排序:全部排序操做都在內存中完成;ui

  • 外排序:因爲數據太大,所以把數據放在磁盤中,而排序經過磁盤和內存的數據傳輸才能進行;spa

  • 時間複雜度:一個算法執行所耗費的時間。3d

  • 空間複雜度:運行完一個程序所需內存的大小。                                                                                                                                                                                         對象

    0.3 算法總結

     

     

    0.4 算法分類

     

     

 

一、冒泡排序(Bubble Sort)

冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,若是它們的順序錯誤就把它們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。blog

這個算法的名字由來是由於越小的元素會經由交換慢慢「浮」到數列的頂端。冒泡排序介紹:冒泡排序排序

1.1 算法描述

  • 比較相鄰的元素。若是第一個比第二個大,就交換它們兩個;遞歸

  • 對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;

  • 針對全部的元素重複以上的步驟,除了最後一個;

  • 重複步驟1~3,直到排序完成。                                                                                                                                                                                                                   

    代碼實現

     

     

    二、選擇排序(Selection Sort)

  • 2.1 算法描述

    n個記錄的直接選擇排序可通過n-1趟直接選擇排序獲得有序結果。具體算法描述以下:

    • 初始狀態:無序區爲R[1..n],有序區爲空;

    • 第i趟排序(i=1,2,3…n-1)開始時,當前有序區和無序區分別爲R[1..i-1]和R(i..n)。該趟排序從當前無序區中-選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R[i+1..n)分別變爲記錄個數增長1個的新有序區和記錄個數減小1個的新無序區;

    • n-1趟結束,數組有序化了。                                                                                                                                                                                                         

      2.3 代碼實現   

      三、插入排序(Insertion Sort)

      3.1 算法描述

      通常來講,插入排序都採用in-place在數組上實現。具體算法描述以下:

      • 從第一個元素開始,該元素能夠認爲已經被排序;

      • 取出下一個元素,在已經排序的元素序列中從後向前掃描;

      • 若是該元素(已排序)大於新元素,將該元素移到下一位置;

      • 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;

      • 將新元素插入到該位置後;

      • 重複步驟2~5。

        3.2 代碼實現

         

         

        四、希爾排序(Shell Sort)

        4.1 算法描述

        咱們來看下希爾排序的基本步驟,在此咱們選擇增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇咱們能夠用一個序列來表示,{n/2,(n/2)/2…1},稱爲增量序列。希爾排序的增量序列的選擇與證實是個數學難題,咱們選擇的這個增量序列是比較經常使用的,也是希爾建議的增量,稱爲希爾增量,但其實這個增量序列不是最優的。此處咱們作示例使用希爾增量。

        先將整個待排序的記錄序列分割成爲若干子序列分別進行直接插入排序,具體算法描述:

        • 選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;

        • 按增量序列個數k,對序列進行k 趟排序;

        • 每趟排序,根據對應的增量ti,將待排序列分割成若干長度爲m 的子序列,分別對各子表進行直接插入排序。僅增量因子爲1 時,整個序列做爲一個表來處理,表長度即爲整個序列的長度。

          4.2 過程演示

           

           

          4.3 代碼實現

          五、歸併排序(Merge Sort)

          5.1 算法描述

          • 把長度爲n的輸入序列分紅兩個長度爲n/2的子序列;

          • 對這兩個子序列分別採用歸併排序;

          • 將兩個排序好的子序列合併成一個最終的排序序列。

            5.2代碼實現

             

             

            六、快速排序(Quick Sort)

           

          6.1 算法描述

          快速排序使用分治法來把一個串(list)分爲兩個子串(sub-lists)。具體算法描述以下:

          • 從數列中挑出一個元素,稱爲 「基準」(pivot);

          • 從新排序數列,全部元素比基準值小的擺放在基準前面,全部元素比基準值大的擺在基準的後面(相同的數能夠到任一邊)。在這個分區退出以後,該基準就處於數列的中間位置。這個稱爲分區(partition)操做;

          • 遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

            6.2 代碼實現

            七、堆排序(Heap Sort)

            7.1 算法描述

            • 將初始待排序關鍵字序列(R1,R2….Rn)構建成大頂堆,此堆爲初始的無序區;

            • 將堆頂元素R[1]與最後一個元素R[n]交換,此時獲得新的無序區(R1,R2,……Rn-1)和新的有序區(Rn),且知足R[1,2…n-1]<=R[n];

            • 因爲交換後新的堆頂R[1]可能違反堆的性質,所以須要對當前無序區(R1,R2,……Rn-1)調整爲新堆,而後再次將R[1]與無序區最後一個元素交換,獲得新的無序區(R1,R2….Rn-2)和新的有序區(Rn-1,Rn)。不斷重複此過程直到有序區的元素個數爲n-1,則整個排序過程完成。

              7.2 代碼實現

               

               

              八、計數排序(Counting Sort)

              8.1 算法描述

              • 找出待排序的數組中最大和最小的元素;

              • 統計數組中每一個值爲i的元素出現的次數,存入數組C的第i項;

              • 對全部的計數累加(從C中的第一個元素開始,每一項和前一項相加);

              • 反向填充目標數組:將每一個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1。

                8.2 代碼實現

                 

                 

                九、桶排序(Bucket Sort)

                9.1 算法描述

                • 人爲設置一個BucketSize,做爲每一個桶所能放置多少個不一樣數值(例如當BucketSize==5時,該桶能夠存放{1,2,3,4,5}這幾種數字,可是容量不限,便可以存放100個3);

                • 遍歷輸入數據,而且把數據一個一個放到對應的桶裏去;

                • 對每一個不是空的桶進行排序,可使用其它排序方法,也能夠遞歸使用桶排序;

                • 從不是空的桶裏把排好序的數據拼接起來。

                注意,若是遞歸使用桶排序爲各個桶排序,則當桶數量爲1時要手動減少BucketSize增長下一循環桶的數量,不然會陷入死

                循環,致使內存溢出。

                 

                9.2 圖片演示

              •  

                 

             

            9.3 代碼實現

            十、基數排序(Radix Sort)

            10.1 算法描述

            • 取得數組中的最大數,並取得位數;

            • arr爲原始數組,從最低位開始取每一個位組成radix數組;

            • 對radix進行計數排序(利用計數排序適用於小範圍數的特色);

              10.2 代碼實現

               

               

相關文章
相關標籤/搜索