你知道多少排序算法?

你知道有哪些排序算法?還記得是怎麼實現的嗎?今天炒雞辣雞就和大家回憶一下有哪些排序算法。

冒泡排序

原理:相鄰的2個數進行比較。每次經過一趟比較,最大數或者最小數就會被交換到最後一位。
時間複雜度:如果是按照從小到大的順序進行排序,只需要把前n-1個大的數歸爲到後面的n-1位即可,所以外層循環只需要到len-1。冒泡排序的最壞情況就是把順序變爲逆序,把逆序變爲順序。時間複雜度O(n^2)

選擇排序

原理:在要排序的一組數中,選出最小的數與第一個數交換,然後再在剩下的數中選出最小的數與第二個數交換….直到第n-1個數與第n個數比較爲止

插入排序

原理:不斷向一個已經排好序的數列中按順序插入數據,最終當最後一個數插入完以後,得到的就是我們需要的有序數列了

希爾排序(插入排序的一種更高效的改進版本)

原理:初期選用大跨步(增量較大)間隔比較,使記錄跳躍式接近它的排序位置;然後增量縮小;最後增量爲 1 ,這樣記錄移動次數大大減少,提高了排序效率

二分排序

原理:在插入第i個元素時,對前面的0~i-1元素進行折半,先跟他們中間的那個元素比,如果小,則對前半再進行折半,否則對後半進行折半,直到left<right,然後再把第i個元素前1位與目標位置之間的所有元素後移,再把第i個元素放在目標位置上

快速排序(又稱分區交換排序,簡稱快排)

原理:

  • 挑選基準值:從數列中挑出一個元素,稱爲“基準”(pivot)
  • 分割:重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(與基準值相等的數可以到任何一邊)。在這個分割結束之後,對基準值的排序就已經完成
  • 遞歸排序子序列:遞歸地將小於基準值元素的子序列和大於基準值元素的子序列排序。
歸併排序

原理:
1)劃分問題:把序列分成元素個數儘量相等的兩半
2)遞歸求解:把兩半元素分別排序
3)合併問題:把兩個有序表合併成一個。(每次只需要把兩個序列的最小元素加以比較,刪除其中的較小元素並加入合併後的新表)

基數排序

原理:以整形爲例,將整形10進制按每位拆分,然後從低位到高位依次比較各個位。主要分爲兩個過程:

(1)分配,先從個位開始,根據位值(0-9)分別放到0~9號桶中(比如64,個位爲4,則放入4號桶中);

(2)收集,再將放置在0~9號桶中的數據按順序放到數組中;

(3)重複(1)(2)過程,從個位到最高位(比如32位無符號整型最大數4294967296,最高位爲第10位)。基數排序的方式可以採用LSD(Least Significant Digital)或MSD(Most Significant Digital),LSD的排序方式由鍵值的最右邊開始,而MSD則相反,由鍵值的最左邊開始。

計數排序

原理:計數排序使用一個額外的數組C,其中第i個元素是待排序數組A中值等於i的元素的個數。然後根據數組C來將A中的元素排到正確的位置。

由於篇幅的原因,這裏就不羅列詳細的實現方案了。我爲大家準備了c語言實現版本,歡迎訪問 https://blog.csdn.net/xielinrui123/article/details/81506146 查看詳情。

知識點我爲大家準備了腦圖,查看下方圖片查看。

在這裏插入圖片描述

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