Go語言數(shù)據(jù)結(jié)構(gòu)之選擇排序示例詳解
選擇排序
選擇排序(selection sort)是一種原地(in-place)排序算法,適用于數(shù)據(jù)量較少的情況。由于選擇操作是基于鍵值的且交換操作只在需要時才執(zhí)行,所以選擇排序長用于數(shù)值較大和鍵值較小的文件。
思想:
對一個數(shù)組進行排序,從未排序的部分反復(fù)找到最小的元素,并將其放在開頭。
給定長度為 nnn 的序列和位置索引i=0 的數(shù)組,選擇排序?qū)ⅲ?/p>
- 遍歷一遍序列,尋找序列中的最小值。在 [i...n−1] 范圍內(nèi)找出最小值
minValue的位置minIndex, - 用當(dāng)前位置的值交換最小值。第 i 項的值與交換 minIndex 的值交換,
swap(nums[i],nums[minIndex]) - 對所有元素重復(fù)上述過程,直到整個序列排序完成。將下限 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)
}
}
動畫演示

Go 代碼實現(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)的第一個元素為最小值保存
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
}
}
}
運行結(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)點:
- 易于實現(xiàn),容易理解
- 原地排序(不需要額外的存儲空間),即 空間復(fù)雜度為 O(1)O(1)O(1)
缺點:
- 擴展性較差
- 時間復(fù)雜度為 O(n2)O(n^2)O(n2)
穩(wěn)定性:
- 選擇排序是不穩(wěn)定的排序算法。
以上就是Go語言數(shù)據(jù)結(jié)構(gòu)之選擇排序示例詳解的詳細內(nèi)容,更多關(guān)于Go 數(shù)據(jù)結(jié)構(gòu)選擇排序的資料請關(guān)注腳本之家其它相關(guān)文章!
- go?sync?Waitgroup數(shù)據(jù)結(jié)構(gòu)實現(xiàn)基本操作詳解
- Golang迭代如何在Go中循環(huán)數(shù)據(jù)結(jié)構(gòu)使用詳解
- Go 語言數(shù)據(jù)結(jié)構(gòu)之雙鏈表學(xué)習(xí)教程
- Go語言數(shù)據(jù)結(jié)構(gòu)之希爾排序示例詳解
- Go 數(shù)據(jù)結(jié)構(gòu)之堆排序示例詳解
- Go語言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解
- go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例
- Go?語言數(shù)據(jù)結(jié)構(gòu)如何實現(xiàn)抄一個list示例詳解
相關(guān)文章
Golang中類型轉(zhuǎn)換利器cast庫的用法詳解
cast庫是一個簡潔而強大的第三方庫,它的主要功能是實現(xiàn)類型之間的安全轉(zhuǎn)換,而在Golang開發(fā)中,類型轉(zhuǎn)換是一個常見且不可避免的過程,下面我們就來看看cast庫在Golang中的具體應(yīng)用吧2024-11-11
go語言 swagger 查詢 json 字段注釋的示例代碼
在Go語言中,使用Swagger通過swag工具和gin-gonic框架生成API文檔,涉及引入依賴、定義模型、添加注釋等步驟,示例中展示了如何為接受查詢參數(shù)的API端點添加注釋,感興趣的朋友跟隨小編一起看看吧2024-09-09

