網(wǎng)站首頁 編程語言 正文
選擇排序
選擇排序是一種簡(jiǎn)單的比較排序算法,它的算法思路是首先從數(shù)組中尋找最小(大)的元素,然后放到數(shù)組中的第一位,接下來繼續(xù)從未排序的元素中尋找最?。ù螅┰兀缓蠓诺揭雅判蛟氐哪┪?,依次類推,直到所有元素被排序。
圖片演示
普通算法
import "fmt" func main() { nums := [8]int{8, 2, 3, 1, 6, 5, 7, 4} fmt.Println("原數(shù)組:", 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("排序后的數(shù)組:", nums) }
執(zhí)行結(jié)果:
原數(shù)組: [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]
--------------------------------
排序后的數(shù)組: [1 2 3 4 5 6 7 8]
- 升序排序。
- 使用
i
變量表示最小元素的待放位置。 -
minPos
變量記錄最小元素的的下標(biāo)值,默認(rèn)為i
。 - 通過變量
j
去尋找最小元素,j
從i + 1
的位置開始尋找。 - 找到比
nums[minPos]
還小的元素,則將j
的下標(biāo)值賦給minPos
。 - 一輪下來,將最小元素的位置
minPos
與i
的位置互換,然后繼續(xù)下一輪尋找,直到所有元素都被排序。 - 該算法的時(shí)間復(fù)雜度為 O(N2)。
優(yōu)化算法
普通算法是尋找最小值或最大值,然后放到指定位置。優(yōu)化算法的改進(jìn)點(diǎn)是同時(shí)尋找最小值和最大值。
import ( "fmt" ) func main() { nums := [4]int{3, 1, 4, 2} fmt.Println("原數(shù)組:", 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,待放最小值的位置,那么最大值就會(huì)被換走,所以需要判斷一下 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("排序后的數(shù)組:", nums) }
執(zhí)行結(jié)果:
原數(shù)組: [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]
--------------------------------
排序后的數(shù)組: [1 2 3 4 5 6 7 8]
-
left
變量表示待放最小值的位置,right
變量表示待放最大值的位置。minPos
記錄最小值的下標(biāo)值,maxPos
記錄最大值的下標(biāo)值,通過變量i
去尋找最小值和最大值,尋找完畢后將它們進(jìn)行交換。 - 有一個(gè)注意的地方是,如果最大值剛好是在
left
,待放最小值的位置,那么最大值就會(huì)被換到minPos
的位置,所以需要判斷一下,糾正下標(biāo)值。 - 從執(zhí)行結(jié)果來看,優(yōu)化后的算法效率快了一倍,但是時(shí)間復(fù)雜度仍為 O(N2)。
小結(jié)
本文簡(jiǎn)單介紹了什么是選擇排序,然后通過圖片的方式演示選擇排序的過程,接下來是實(shí)現(xiàn) O(N2) 時(shí)間復(fù)雜度的算法,最后優(yōu)化算法,從結(jié)果來看,優(yōu)化后的算法效率快了一倍,但是時(shí)間復(fù)雜度仍為 O(N2)。
原文鏈接:https://juejin.cn/post/7174806123160010809
相關(guān)推薦
- 2022-11-13 如何修改npm默認(rèn)源為淘寶源
- 2022-05-22 PXE?kickstart自動(dòng)化部署系統(tǒng)安裝_linux shell
- 2022-05-01 教你利用python如何讀取txt中的數(shù)據(jù)_python
- 2023-03-27 Android三種雙屏異顯實(shí)現(xiàn)方法介紹_Android
- 2022-05-03 python中的Pytorch建模流程匯總_python
- 2022-12-19 Oracle?Instr函數(shù)實(shí)例講解_oracle
- 2022-04-12 在碼云遠(yuǎn)程倉庫提交時(shí)遇到的問題error: failed to push some refs to
- 2022-09-01 ASP.NET?Core通用主機(jī)實(shí)現(xiàn)托管服務(wù)_實(shí)用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支