常見經典排序算法總結

在這裏插入圖片描述
算法幾乎是每個軟件從業者都會或多或少需要接觸的內容,而排序則是算法中最基礎的內容,這篇文章整理了常見的經典排序算法,並對於算法的實現和要點進行整理。


經典排序之冒泡排序

冒泡排序顧名思義,升序排序的時候小的元素像氣泡一樣一個一個的浮上去,對於N個元素,通過兩層循環來完成排序,外層循環N-1次,下標用來記錄已排序的元素的位置,升序的要求下每次獲取當次排序中的最小值,並將其排在已排序的最後一個。內層循環使用臨位相比的方法來確定是否需要進行交換,在內層循環中保證外層循環的當前下標中保存的是當前剩餘元素中的最小元素。

詳細的實現與要點解析可參看如下內容:


經典排序之選擇排序

選擇排序和冒泡排序非常相像,都是使用比較和交換作爲排序的重要手段,每次外層循環得到一個未排序的最小值,將序列分爲已排序和未排序兩種。但區別也非常清晰,冒泡排序的交換在內層循環進行,選擇排序的交換在外層進行,內層循環只需要獲取當次循環最小元素的下標。

詳細的實現與要點解析可參看如下內容:


經典排序之插入排序

插入排序在理解上可以參考打牌時的同花順的單手排序過程,插入只是算法的一個重要動作,另外還有一個動作就是選擇,如果將插入排序理解爲元素從1到N的一個初始化過程,每次插入之後保證當前的序列是已排序的也沒有問題,但是這種情況需要而外的一個O(n)的空間,相較於冒泡排序和選擇排序的交換,插入排序的特點在於後移和插入。首先將外層循環的當前元素保存在一個額外的變量之中,內層循環顯著的特點是在已排序的序列中進行循環,根據要插入的元素和已排序的元素進行比較,決定移位。然後在外層循環中進行插入。

詳細的實現與要點解析可參看如下內容:


經典排序之希爾排序

希爾排序是在插入排序的基礎上進行的,增量遞減的插入排序改進是希爾算法的核心內容,增量在算法中被稱爲增量,比如一個待排序列有10個元素,增量遞減的思路可以進行自行定製,比如除2,首次增量爲10/2=5,然後接下來爲5/2=2,然後2/2=1,所以稱爲增量遞減。

詳細的實現與要點解析可參看如下內容:


經典排序之計數排序

計數排序在理解上大概是比冒泡排序還要簡單的排序,它的做法就是根據待排序的內容生成一大塊連續的空間,能夠保存待排序的最大值-最小值的範圍,然後巧妙的將值作爲下標進行保存,而該下標的元素中保持記錄重複的次數,然後輸出的時候根據順序進行輸出,有計數值的按照計數值進行輸出即可,有重複的根據計數值進行遞減。雖然此排序有時被成爲桶排序或者箱排序,雖然可以將其理解爲桶的個數最大情況下的個例,但是多少還是有些不同。

詳細的實現與要點解析可參看如下內容:


經典排序之歸併排序

歸併排序在理解上的那點複雜性主要在於其遞歸方式的分而治之的拆分與合併。歸併在漢語中本身就含有合併的意義,實際上更準確的說,應該是拆分合並算法,拆分至單個元素,這樣最小力度都是有序的,然後遞歸的合併就可以在有序的基礎上進行了,而有序狀況下的合併複雜度是很容易可以做到O(n)的,由於分層是可以達到對數級的效率,所以整體的複雜度爲O(nlogn)。

詳細的實現與要點解析可參看如下內容:


經典排序之快速排序

快速排序乍一看很像歸併排序,但實際上這是由於兩者都是使用了分而治之的思路,所以在算法上都有遞歸的實現。但是仔細看來二者還是有很多區別的。快速排序的核心在於分區算法,分區算法設定基準值,根據基準值將數據分爲三部分:左側小於基準值序列、基準值、右側大於基準值的序列。層層遞歸即完成整體快排。

詳細的實現與要點解析可參看如下內容:



總結

包括快排在內的經典排序算法的實現都非常簡單,如果寫的簡潔一些的情況下,核心排序代碼往往只需數行,還是值得認真學習和總結一下的。