網站首頁 編程語言 正文
排序算法是在生活中隨處可見,也是算法基礎,因為其實現代碼較短,應用較常見。所以在面試中經常會問到排序算法及其相關的問題,可以說是每個程序員都必須得掌握的了。為了方便大家學習,花了一天的時間用Go語言實現一下常用的算法且整理了一下,如有需要可以參考。
冒泡排序
思路:從前往后對相鄰的兩個元素依次進行比較,讓較大的數往下沉,較小的網上冒,即每當兩個相鄰的元素比較后發現他們的排序要求相反時,就將它們互換。
時間復雜度:O(N^2)
空間復雜度:O(1)
func main() { fmt.Println(bubbleSort([]int{2, 4, 1, 6, 3})) } func bubbleSort(list []int) []int { lenth := len(list) for i := 0; i <= lenth; i++ {//循環對比的輪數 exchange := false for j := 1; j < lenth-i; j++ {//當前輪相鄰元素循環對比 if list[j-1] > list[j]{//如果前邊的大于后邊的 list[j-1], list[j] = list[j], list[j-1]//交換數據 exchange = true } } if !exchange { break } } return list }
快速排序
思路:以一個基準數將數組拆分為兩組,一邊大于這個數,一邊小于這個數,再最左右兩個組重復這個過程,直到各個區域只有一個數。
時間復雜度:O(nlogn)
空間復雜度:O(1)
func quickSort(list []int) []int { length := len(list) if length <= 1 { return list } //基準值 base := list[0] left := make([]int, 0) right := make([]int, 0) for i := 1; i < length; i++ { if list[i] > base { right = append(right, list[i]) } else { left = append(left, list[i]) } } left, right = quickSort(left), quickSort(right) return append(append(left, base),right...) }
選擇排序
思路:首先找到數組中的最小元素,然后將這個最小元素和數組的第一個元素交換位置,如果第一個元素就是最小元素,就和自己交換位置;再次,在剩下的元素中找到最小元素和數組中的第二個元素交換位置,如此往復,直到將整個數組排序,一句話總結就是,不斷在剩余元素中找最小元素。
時間復雜度:O(n^2)
空間復雜度:O(1)
func selectSort(list []int) []int { length := len(list) for i := 0; i < length; i++ { minIndex := i //每次循環找出i+1到最后一個元素區間的最小值,然后當前元素和當前最小值比較 for j := i + 1; j < length; j++ { if list[j] < list[minIndex] { minIndex = j } } if i != minIndex { list[i], list[minIndex] = list[minIndex], list[i] } } return list }
插入排序
思路:與選擇排序一樣,當前索引左邊的所有元素都是有序的,但是他們的最終位置還不確定,為了給更小的元素騰出空間,他們可能會被移動,但是當索引到達數組的末端,數組排序就完成了。
時間復雜度:O(N^2)
空間復雜度:O(1)
func insertSort(list []int) []int { length := len(list) for i := 0; i < length; i++ { for j := i; j > 0; j-- { if list[j] > list[j-1] { break } list[j], list[j-1] = list[j-1], list[j] } } return list }
排序思路算法幾乎一樣。 暫時就介紹這幾種常用的也是面試中經常問道的排序算法。
原文鏈接:https://juejin.cn/post/7130090981658984461
相關推薦
- 2022-06-11 kubernetes實現分布式限流_云和虛擬化
- 2022-12-29 Android開發中用Kotlin編寫LiveData組件教程_Android
- 2022-12-06 c++入門必學算法之快速冪思想及實現_C 語言
- 2023-02-26 go?defer?return?panic?執行順序示例詳解_Golang
- 2022-07-26 使用SpringBoot?+?Redis?實現接口限流的方式_Redis
- 2022-05-12 C語言?Freertos的遞歸鎖詳解_C 語言
- 2022-10-04 正則表達式中關于對原生字符串的簡單理解_正則表達式
- 2023-05-30 Pandas中DataFrame對象轉置(交換行列)_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支