網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
選擇排序
選擇排序(selection?sort)是一種原地(in-place)排序算法,適用于數(shù)據(jù)量較少的情況。由于選擇操作是基于鍵值的且交換操作只在需要時(shí)才執(zhí)行,所以選擇排序長(zhǎng)用于數(shù)值較大和鍵值較小的文件。
思想:
對(duì)一個(gè)數(shù)組進(jìn)行排序,從未排序的部分反復(fù)找到最小的元素,并將其放在開(kāi)頭。
給定長(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ù)上述過(guò)程,直到整個(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)畫(huà)演示
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-09-06 C#面向?qū)ο缶幊讨虚_(kāi)閉原則的示例詳解_C#教程
- 2022-01-13 macOS 升級(jí)后 nvm 安裝的 node 和 npm 出錯(cuò)
- 2023-03-26 使用docker安裝hadoop的實(shí)現(xiàn)過(guò)程_docker
- 2023-05-31 如何在ubuntu中切換使用不同版本的python_python
- 2022-11-11 Android學(xué)習(xí)之菜單的使用方法_Android
- 2022-07-12 luckySheet在線(xiàn)編輯excel及遇到的問(wèn)題
- 2022-03-17 C#實(shí)現(xiàn)多文件打包壓縮(.Net?Core)_C#教程
- 2022-06-04 為Centos安裝指定版本的Docker_docker
- 最近更新
-
- 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)證過(guò)濾器
- Spring Security概述快速入門(mén)
- 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)程分支