1. 程式人生 > >「乾貨總結」程式設計師必知必會的十大排序演算法

「乾貨總結」程式設計師必知必會的十大排序演算法

> 首發公眾號:**bigsai** 轉載需聯絡 新人求支援 > 文章已收錄在 [bigsai-algorithm](https://github.com/javasmall/bigsai-algorithm) 長期維護 ## 緒論 身為程式設計師,十大排序是是所有合格程式設計師所必備和掌握的,並且熱門的演算法比如快排、歸併排序還可能問的比較細緻,對演算法效能和複雜度的掌握有要求。bigsai作為一個負責任的Java和資料結構與演算法方向的小博主,在這方面肯定不能讓讀者們有所漏洞。跟著本篇走,帶你捋一捋常見的十大排序演算法,輕輕鬆鬆掌握! 首先對於排序來說大多數人對排序的概念停留在氣泡排序或者JDK中的Arrays.sort(),手寫各種排序對很多人來說都是一種奢望,更別說十大排序演算法了,不過還好你遇到了本篇文章! 對於排序的分類,主要不同的維度比如複雜度來分、內外部、比較非比較等維度來分類。我們正常講的十大排序演算法是內部排序,我們更多將他們分為兩大類:基於**比較和非比較**這個維度去分排序種類。 - **非比較類的有桶排序、基數排序、計數排序**。也有很多人將排序歸納為8大排序,那就是因為基數排序、計數排序是建立在桶排序之上或者是一種特殊的桶排序,但是基數排序和計數排序有它特有的特徵,所以在這裡就將他們歸納為10種經典排序演算法。而比較類排序也可分為 - 比較類排序也有更細緻的分法,有基於交換的、基於插入的、基於選擇的、基於歸併的,更細緻的可以看下面的腦圖。 ![image-20201120124138560](https://bigsai.oss-cn-shanghai.aliyuncs.com/img/image-20201120124138560.png) ## 交換類 ### 氣泡排序 氣泡排序,又稱起泡排序,它是一種基於交換的排序典型,也是快排思想的基礎,氣泡排序是一種穩定排序演算法,時間複雜度為O(n^2).基本思想是:**迴圈遍歷多次每次從前往後把大元素往後調,每次確定一個最大(最小)元素,多次後達到排序序列。**(或者從後向前把小元素往前調)。 具體思想為(把大元素往後調): - 從第一個元素開始往後遍歷,每到一個位置判斷是否比後面的元素大,如果比後面元素大,那麼就交換兩者大小,然後繼續向後,這樣的話進行一輪之後就可以保證**最大的那個數被交換交換到最末的位置可以確定**。 - 第二次同樣從開始起向後判斷著前進,如果當前位置比後面一個位置更大的那麼就和他後面的那個數交換。但是有點注意的是,這次並不需要判斷到最後,只需要判斷到倒數第二個位置就行(因為第一次我們已經確定最大的在倒數第一,這次的目的是確定倒數第二) - 同理,後面的遍歷長度每次減一,直到第一個元素使得整個元素有序。 例如`2 5 3 1 4`排序過程如下: ![image-20201120155114930](https://bigsai.oss-cn-shanghai.aliyuncs.com/img/image-20201120155114930.png) 實現程式碼為: ```java public void maopaosort(int[] a) { // TODO Auto-generated method stub for(int i=a.length-1;i>=0;i--) { for(i