網站首頁 編程語言 正文
選擇排序
選擇排序是一種簡單的比較排序算法,它的算法思路是首先從數組中尋找最小(大)的元素,然后放到數組中的第一位,接下來繼續從未排序的元素中尋找最小(大)元素,然后放到已排序元素的末尾,依次類推,直到所有元素被排序。
圖片演示
普通算法
import "fmt" func main() { nums := [8]int{8, 2, 3, 1, 6, 5, 7, 4} fmt.Println("原數組:", nums) fmt.Println("--------------------------------") SelectionSort(nums) } func SelectionSort(nums [8]int) { for i := 0; i < len(nums)-1; i++ { minPos := i for j := i + 1; j < len(nums); j++ { if nums[minPos] > nums[j] { minPos = j } } nums[i], nums[minPos] = nums[minPos], nums[i] fmt.Printf("第 %d 輪后:%v\n", i+1, nums) } fmt.Println("--------------------------------") fmt.Println("排序后的數組:", nums) }
執行結果:
原數組: [8 2 3 1 6 5 7 4]
--------------------------------
第 1 輪后:[1 2 3 8 6 5 7 4]
第 2 輪后:[1 2 3 8 6 5 7 4]
第 3 輪后:[1 2 3 8 6 5 7 4]
第 4 輪后:[1 2 3 4 6 5 7 8]
第 5 輪后:[1 2 3 4 5 6 7 8]
第 6 輪后:[1 2 3 4 5 6 7 8]
第 7 輪后:[1 2 3 4 5 6 7 8]
--------------------------------
排序后的數組: [1 2 3 4 5 6 7 8]
- 升序排序。
- 使用
i
變量表示最小元素的待放位置。 -
minPos
變量記錄最小元素的的下標值,默認為i
。 - 通過變量
j
去尋找最小元素,j
從i + 1
的位置開始尋找。 - 找到比
nums[minPos]
還小的元素,則將j
的下標值賦給minPos
。 - 一輪下來,將最小元素的位置
minPos
與i
的位置互換,然后繼續下一輪尋找,直到所有元素都被排序。 - 該算法的時間復雜度為 O(N2)。
優化算法
普通算法是尋找最小值或最大值,然后放到指定位置。優化算法的改進點是同時尋找最小值和最大值。
import ( "fmt" ) func main() { nums := [4]int{3, 1, 4, 2} fmt.Println("原數組:", nums) fmt.Println("--------------------------------") SelectionSort(nums) } func SelectionSort(nums [4]int) { for left, right := 0, len(nums)-1; left <= right; { minPos := left maxPos := left for i := left + 1; i <= right; i++ { if nums[minPos] > nums[i] { minPos = i } if nums[maxPos] < nums[i] { maxPos = i } } nums[left], nums[minPos] = nums[minPos], nums[left] // 如果最大值剛好是在 left,待放最小值的位置,那么最大值就會被換走,所以需要判斷一下 if maxPos == left { maxPos = minPos } nums[right], nums[maxPos] = nums[maxPos], nums[right] fmt.Printf("第 %d 輪后:%v\n", left+1, nums) left++ right-- } fmt.Println("--------------------------------") fmt.Println("排序后的數組:", nums) }
執行結果:
原數組: [8 2 3 1 6 5 7 4]
--------------------------------
第 1 輪后:[1 2 3 4 6 5 7 8]
第 2 輪后:[1 2 3 4 6 5 7 8]
第 3 輪后:[1 2 3 4 5 6 7 8]
第 4 輪后:[1 2 3 4 5 6 7 8]
--------------------------------
排序后的數組: [1 2 3 4 5 6 7 8]
-
left
變量表示待放最小值的位置,right
變量表示待放最大值的位置。minPos
記錄最小值的下標值,maxPos
記錄最大值的下標值,通過變量i
去尋找最小值和最大值,尋找完畢后將它們進行交換。 - 有一個注意的地方是,如果最大值剛好是在
left
,待放最小值的位置,那么最大值就會被換到minPos
的位置,所以需要判斷一下,糾正下標值。 - 從執行結果來看,優化后的算法效率快了一倍,但是時間復雜度仍為 O(N2)。
小結
本文簡單介紹了什么是選擇排序,然后通過圖片的方式演示選擇排序的過程,接下來是實現 O(N2) 時間復雜度的算法,最后優化算法,從結果來看,優化后的算法效率快了一倍,但是時間復雜度仍為 O(N2)。
原文鏈接:https://juejin.cn/post/7174806123160010809
相關推薦
- 2022-09-16 Pandas統計計數value_counts()的使用_python
- 2022-08-22 Go語言學習之Switch語句的使用_Golang
- 2022-07-03 使用pyscript在網頁中撰寫Python程式的方法_python
- 2023-07-09 echarts的series已經為空但是還加載出數據
- 2023-01-13 解決安裝torch后,torch.cuda.is_available()結果為false的問題_py
- 2022-11-18 使用sealos快速搭建K8s集群環境的過程_云其它
- 2022-04-24 TypeScript基礎class類教程示例_基礎知識
- 2022-03-12 Android列表點擊事件定義的一些思考_Android
- 最近更新
-
- 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同步修改后的遠程分支