網(wǎng)站首頁 編程語言 正文
選擇排序
選擇排序(selection?sort)是一種原地(in-place)排序算法,適用于數(shù)據(jù)量較少的情況。由于選擇操作是基于鍵值的且交換操作只在需要時(shí)才執(zhí)行,所以選擇排序長(zhǎng)用于數(shù)值較大和鍵值較小的文件。
思想:
對(duì)一個(gè)數(shù)組進(jìn)行排序,從未排序的部分反復(fù)找到最小的元素,并將其放在開頭。
給定長(zhǎng)度為 nnn 的序列和位置索引i=0 的數(shù)組,選擇排序?qū)ⅲ?/p>
- 遍歷一遍序列,尋找序列中的最小值。在 [i...n?1] 范圍內(nèi)找出最小值
minValue
的位置minIndex
, - 用當(dāng)前位置的值交換最小值。第 i 項(xiàng)的值與交換 minIndex 的值交換,
swap(nums[i],nums[minIndex])
- 對(duì)所有元素重復(fù)上述過程,直到整個(gè)序列排序完成。將下限 iii 增加1,并重復(fù)步驟 1 直到 i=n?2。
偽代碼:
func selectionSort(nums []int, length int) { for i := 0; i < length-1; i++ { // O(N) minValue = nums[minIdx] // O(N) swap(nums[i], nums[minIndex]); // O(1), X may be equal to L (no actual swap) } }
動(dòng)畫演示
Go 代碼實(shí)現(xiàn)
package main import "fmt" func main() { unsorted := []int{40, 13, 20, 8, 12, 10, 27} length := len(unsorted) selectionSort(unsorted, length) for i := 0; i < length; i++ { fmt.Printf("%d\t", unsorted[i]) } } func selectionSort(nums []int, length int) { var minIdx int // 被選擇的最小的值的位置 for i := 0; i < length-1; i++ { minIdx = i // 每次循環(huán)的第一個(gè)元素為最小值保存 var minValue = nums[minIdx] for j := i; j < length-1; j++ { if minValue > nums[j+1] { minValue = nums[j+1] minIdx = j + 1 } } // 如果最小值的位置改變,將當(dāng)前的最小值位置保存 if i != minIdx { var temp = nums[i] nums[i] = nums[minIdx] nums[minIdx] = temp } } }
運(yùn)行結(jié)果為:
[Running] go run "e:\Coding Workspaces\LearningGoTheEasiestWay\Go 數(shù)據(jù)結(jié)構(gòu)\選擇排序\main.go"\
8 10 12 13 20 27 40
總結(jié)
選擇排序的優(yōu)點(diǎn):
- 易于實(shí)現(xiàn),容易理解
- 原地排序(不需要額外的存儲(chǔ)空間),即 空間復(fù)雜度為 O(1)O(1)O(1)
缺點(diǎn):
- 擴(kuò)展性較差
- 時(shí)間復(fù)雜度為 O(n2)O(n^2)O(n2)
穩(wěn)定性:
- 選擇排序是不穩(wěn)定的排序算法。
原文鏈接:https://juejin.cn/post/7042671726114635812
相關(guān)推薦
- 2022-06-01 C#文件操作、讀取文件、Debug/Trace類用法_C#教程
- 2022-05-03 python讀寫xml文件實(shí)例詳解嘛_python
- 2023-04-06 C語言中的多行輸入問題及說明_C 語言
- 2022-11-10 C++在多線程中使用condition_variable實(shí)現(xiàn)wait_C 語言
- 2022-09-04 django連接數(shù)據(jù)庫獲取數(shù)據(jù)的簡(jiǎn)單步驟記錄_python
- 2022-09-22 stack和queue的模擬實(shí)現(xiàn)
- 2022-11-10 關(guān)于docker?cgroups資源限制的問題_docker
- 2022-07-17 oracle數(shù)據(jù)庫去除重復(fù)數(shù)據(jù)常用的方法總結(jié)_oracle
- 最近更新
-
- 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)程分支