成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言算法之美—基礎排序

開發 后端 算法
冒泡排序基于比較并交換,基本思路是遍歷數據,如果相鄰的元素大小不等,則交換它們的位置,如此循環往復,直到數據完全有序。

[[404642]]

本文轉載自微信公眾號「roseduan寫字的地方」,作者roseduan。轉載本文請聯系roseduan寫字的地方公眾號。

錄制 rosedb 視頻的時候,挖了個坑,說要用 Go 語言實現常見的數據結構和算法,雖然現在這樣的文章已經很多了,但是玫瑰哥??有坑必填!只能硬著頭皮寫了,這個系列,就叫做 Go 語言算法之美吧!

排序是一個十分古老的問題,也是計算機領域很經典的算法問題之一,后續的幾篇文章,我將對常見的排序算法進行講述。

我將會附上完整的代碼,并且推薦一些相關的 Leetcode 題目,不僅可以用來學習鞏固算法知識,還能夠幫助你在面試當中,更加的游刃有余。

本篇文章介紹三種基礎排序算法:冒泡排序、選擇排序、插入排序。

冒泡排序

冒泡排序基于比較并交換,基本思路是遍歷數據,如果相鄰的元素大小不等,則交換它們的位置,如此循環往復,直到數據完全有序。

如下圖,有測試數據 -2 45 0 11 -9。

在第一次遍歷當中,會將數據中最大值 45 移動至末尾,然后在除了 45 的數據內再次遍歷,將最大值移動至 45 之前。這樣遍歷完最后一個元素,數據即是有序的了。

下圖比較直觀的展示了冒泡排序的流程:

代碼如下:

  1. func bubbleSort(data []int) { 
  2.    for i := 0; i < len(data); i++ { 
  3.       for j := 0; j < len(data)-i-1; j++ { 
  4.          if data[j] > data[j+1] { 
  5.             data[j], data[j+1] = data[j+1], data[j] 
  6.          } 
  7.       } 
  8.    } 

這里有一個小的優化點,如果數據本來就是有序的,例如 1 3 4 5 6 ,遍歷一次之后,會發現沒有任何數據進行交換,可以提前退出,不用繼續進行遍歷了,代碼上可以進行優化,如下:

  1. func bubbleSort(data []int) { 
  2.    swap := true 
  3.    for i := 0; i < len(data) && swap; i++ { 
  4.       swap = false 
  5.       for j := 0; j < len(data)-i-1; j++ { 
  6.          if data[j] > data[j+1] { 
  7.             data[j], data[j+1] = data[j+1], data[j] 
  8.             swap = true 
  9.          } 
  10.       } 
  11.    } 

冒泡排序相關復雜度:

時間復雜度  
最壞 O(n2)
最好 O(n)
平均 O(n2)
空間復雜度 O(1)
是否穩定

選擇排序

選擇排序也很容易理解,對于一個無序的數組,我們每次都從數組中尋找最小值,并把它和第一個元素交換。

如下圖,有測試數據 20 12 10 15 2,第一次遍歷,尋找到最小值是 2:

并將其與數組的第一個元素進行交換:

然后在剩下的數據中繼續尋找最小值,然后將其與數組第二個元素交換,如此循環往復,直到最后一個數據,這樣整個數組便是有序的了。

下面這張動圖可以幫助你理解選擇排序的整個過程:

代碼實現:

  1. func selectionSort(data []int) { 
  2.    for i := 0; i < len(data)-1; i++ { 
  3.       min := i 
  4.       for j := i + 1; j < len(data); j++ { 
  5.          if data[j] < data[min] { 
  6.             min = j 
  7.          } 
  8.       } 
  9.       data[i], data[min] = data[min], data[i] 
  10.    } 

選擇排序相關復雜度:

時間復雜度  
最壞 O(n2)
最好 O(n2)
平均 O(n2)
空間復雜度 O(1)
是否穩定

插入排序

回想一下我們在玩紙牌游戲時,是如何將手中的紙牌變得有順序的?當新來了一張紙牌,我們會在手中已有的紙牌中查找到合適的位置,將其插入。

插入排序也是這樣的,依次遍歷數組中的每一個數據,將其插入到合適的位置,下面的這張動圖比較形象的說明了這個過程:

代碼實現如下:

  1. func insertionSort(data []int) { 
  2.    for i := 0; i < len(data)-1; i++ { 
  3.       j, k := i+1, data[i+1] 
  4.       for ; j > 0 && data[j-1] > k; j-- { 
  5.          data[j] = data[j-1] 
  6.       } 
  7.       data[j] = k 
  8.    } 

插入排序相關復雜度:

時間復雜度  
最壞 O(n2)
最好 O(n)
平均 O(n2)
空間復雜度 O(1)
是否穩定

備注:完整代碼我放到了我的 Github 上面,地址:

 

https://github.com/roseduan/Go-Algorithm

 

責任編輯:武曉燕 來源: roseduan寫字的地方
相關推薦

2021-08-04 08:56:34

語言Go排序

2021-07-16 04:57:45

Go算法結構

2022-11-01 18:29:25

Go語言排序算法

2023-05-08 07:55:05

快速排序Go 語言

2022-05-07 08:55:11

Go語言排序算法

2022-04-06 08:58:39

歸并排序Go算法

2021-02-06 18:19:54

TimeGo語言

2022-03-07 09:42:21

Go快速排序

2020-11-23 08:54:14

Go語言結構體

2020-11-30 06:17:03

Go語言

2020-12-02 08:45:36

Go語言

2020-11-26 06:40:24

Go語言基礎

2023-12-30 10:22:57

Go語言函數開發

2021-01-19 07:02:26

算法數據結構堆排序

2021-01-23 12:47:19

MySQL數據庫Go語言

2021-11-05 22:47:44

冒泡排序選擇插入

2024-01-07 19:54:51

2020-10-22 08:33:22

Go語言

2020-11-11 10:52:54

Go語言C語言

2020-12-16 08:07:28

語言基礎反射
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色视频www在线播放国产人成 | 日韩在线视频观看 | 日本二区在线观看 | 欧美一级视频在线观看 | 91视频正在播放 | 操人网站 | 九九精品在线 | 一区日韩 | 久久久久中文字幕 | 天天操天天干天天爽 | 欧美群妇大交群中文字幕 | 国产日韩免费视频 | 国产羞羞视频在线观看 | 亚洲美女视频 | 成人区精品一区二区婷婷 | 午夜影视大全 | 国产专区在线 | 91色网站 | 久久亚洲欧美日韩精品专区 | 国产在线视频三区 | 香蕉视频91 | 国产精品国产三级国产aⅴ中文 | av香港经典三级级 在线 | 国产精品一区二区三 | 黄色小视频大全 | 午夜精品一区二区三区在线视频 | 亚洲综合色视频在线观看 | 人人干人人爽 | 蜜桃在线一区二区三区 | 久热国产精品视频 | 美女久久| 精品久久一区二区三区 | 日韩精品视频在线观看一区二区三区 | 欧美一区免费 | 亚洲三级在线 | 伊人精品 | 欧美日韩在线综合 | 欧州一区二区三区 | 久久草视频| 操久久| 欧美日韩国产一区 |