本文系轉載
原文地址:
http://www.limerence2017.com/2019/06/29/golang07/
前面已經介紹golang基本的語法和容器了,這一篇文章用golang實現四種排序算法,快速排序,插入排序,選擇排序,冒泡排序。既可以總結前文的基礎知識,又可以熟悉下golang如何實現這四種排序。
快速排序
算法介紹
假設用戶輸入了如下數組
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 6 | 2 | 7 | 3 | 8 | 9 |
創建變量i=0(指向第一個數據), j=5(指向最后一個數據), k=6(賦值為第一個數據的值)
我們要把所有比k小的數移動到k的左面,所以我們可以開始尋找比6小的數,從j開始,從右往左找,不斷遞減變量j的值,我們找到第一個下標3的數據比6小,於是把數據3移到下標0的位置,把下標0的數據6移到下標3,完成第一次比較
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 3 | 2 | 7 | 6 | 8 | 9 |
i=0 j=3 k=6
接着,開始第二次比較,這次要變成找比k大的了,而且要從前往后找了。遞加變量i,發現下標2的數據是第一個比k大的,於是用下標2的數據7和j指向的下標3的數據的6做交換,數據狀態變成下表:
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 3 | 2 | 6 | 7 | 8 | 9 |
i=2,j=3,k=6
接下來繼續重復上邊的步驟,從j開始,從右往左找比k小的,此時i=2,j=3,j再移動一位就和i相等了,此時就完成了k=6的排序,此時k=6,i和j相等都為2,6右邊的數都比6大,6左邊的數比6小。
接下來分別比較6左邊的序列(下標從0到1)和6右邊(下標從3到5)的序列,同樣采用上述辦法,直到所有序列都比較完成。
算法實現
1 |
func quickSort(slice []int, begin int, end int) { |
插入排序
算法描述
假設用戶輸入了如下數組
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 6 | 2 | 7 | 3 | 8 | 9 |
假設從小到大排序
插入排序先從下標為1的元素2開始,比較前邊下標為0的元素6,2比6小,則將6移動到2的位置,2放到6的位置
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 2 | 6 | 7 | 3 | 8 | 9 |
記下來比較下標為2的元素7,和前邊0~1下標的元素對比,從后往前找,如果找到比7大的元素,則將該元素后邊的序列依次后移,將7插入該元素位置
目前7不需要移動。
接下來尋找下標為3 的元素3,從下標3往前找,由於下標1,下標2的元素都比3大,所以依次后移,將3放倒下標1的位置。
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 2 | 3 | 6 | 7 | 8 | 9 |
以此類推,進行比較。
算法實現
1 |
func insertSort(slice []int) { |
該算法時間復雜度為O(n*n)
冒泡排序
算法描述
假設用戶輸入了如下數組
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 6 | 2 | 7 | 3 | 8 | 9 |
冒泡排序依次比較相鄰的兩個元素 ,將大的元素后移即可。
先比較下標為0和下標為1的元素,6比2大,所以6和2交換位置。
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 2 | 6 | 7 | 3 | 8 | 9 |
接下來比較下標為1和下標為2的元素,6比7小所以不做交換。然后比較7和3,7比3大,7和三交換位置,以此類推,直到比較到最后一個元素
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 2 | 6 | 3 | 7 | 8 | 9 |
經過這一輪相鄰元素的比較,將最大的元素9冒泡到最后的位置。
接下來重復上述步驟,從下標0開始到下標4兩兩比較,將第二大元素放到下標4的位置,因為下標5已經是最大元素,所以不參與比較。
算法實現
1 |
func bubbleSort(slice []int) { |
選擇排序
算法描述
假設用戶輸入了如下數組
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 6 | 2 | 7 | 3 | 8 | 9 |
從下標0開始,比較6和其他位置的元素,找到最小的元素2和6交換位置
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 2 | 6 | 7 | 3 | 8 | 9 |
接下來從下標1開始,比較6和后邊位置的元素,選擇最小的和6交換位置。
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 2 | 3 | 7 | 6 | 8 | 9 |
以此類推,從下標2開始,比較7和后邊的元素,選擇最小的6交換位置
下標 | 0 | 1 | 2 | 3 | 4 | 5 |
數值 | 2 | 3 | 6 | 7 | 8 | 9 |
以此類推,直到下標5的位置元素都比較完。
算法實現
1 |
func selectSort(slice []int) { |
該算法時間復雜度為o(n*n)
main函數中調用並測試
1 |
func main() { |
到此為止,四種基本的比較算法已經完成,感興趣的可以自己實現以下。
上述所有源碼下載地址
源碼下載地址
謝謝關注我的公眾號